Подтвердить что ты не робот

Обработка исключений: наконец-то выполняется после броска?

Предположим, что у вас есть следующий код:

Вместо этого:

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

4b9b3361

Ответ 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 и некоторые случаи с многопотоком)