Обработка исключений: наконец-то выполняется после броска?
Предположим, что у вас есть следующий код:
Вместо этого:
Try
'
' Initialize some objects
'
'
' do something that fails
'
'
' Clean up-code that gets not reached because exception
'
Catch e As Exception
'
'Clean up initialized objects
'
Throw e
End Try
Я хотел бы сделать:
Try
'
' Initialize some objects
'
'
' do something that fails
'
Catch e As Exception
Throw e
Finally
'
'Clean up initialized objects
'
End Try
Итак, мой простой вопрос: если исключение - это окончательный блок, достигнутый, даже если есть бросок каких-то строк до?
[EDIT]
Спасибо за ваши быстрые ответы.
В первой строке будут найдены NullReference-, COM- и FileNotFound-исключения.
Хорошо, я пойду для этого кода:
Try
'
' Initialize some objects
'
'
' do something that fails
'
Catch e As Exception ' or just "Catch"??
Throw
Finally
'
'Clean up initialized objects
'
End Try
Все самое лучшее!
Inno
Ответы
Ответ 1
Итак, мой простой вопрос: если исключение - это окончательный блок, достигнутый, даже если есть бросок каких-то строк до?
Да. Finally
block всегда выполняется 1) и существует точно для очистки. В вашем коде удалите блок Catch
, он ничего не делает. Хуже того, он фактически уничтожает трассировку стека, потому что вы не повторно бросаете исходное исключение, вы бросаете новый.
Если вам действительно нужен блок Catch
, который затем повторно генерирует исключение, используйте следующее:
Catch e As XyzException
' … do some stuff. '
Throw
End Try
1): Предостережение emptor: есть некоторые исключения, такие как StackOverflowException
(как подходит...), которые требуют особого внимания и могут не запускать блок Finally
. Правильное обращение с ними обычно довольно сложно.
Ответ 2
Нет, он НЕ гарантированно работает. Существуют определенные исключения - например, StockOverflowException и OutOfMemoryException - где выполнение блока finally не гарантируется.
Ответ 3
Почти во всех случаях a будет выполняться в блоке Try/Catch (заметные исключения, в том числе при возникновении исключения StackOverflowException или OutOfMemoryException). Мне любопытно, почему вы не пробовали это для себя. Ценный способ научиться - это попробовать их сами - в конце концов, вы можете принять неверный или вводящий в заблуждение ответ, и с этого момента вы будете трудиться под этой ложью.
Ответ 4
ПРИМЕЧАНИЕ. Метод System.Environment.FastFail немедленно уничтожал текущий процесс/поток, без выполнения окончательных разделов.
Ответ 5
Да, это так, наконец, выполняется в любом случае. (есть только несколько исключений - Response.Redirect и некоторые случаи с многопотоком)