Блоки try-catch-finally работают точно так, как вы ожидали , если они были пойманы в какой-то момент . Когда я написал для этого тестовую программу и использовал различные уровни вложенности, единственным случаем, когда она вела себя так, как вы описали, был случай, когда исключение полностью не обрабатывалось кодом и передавалось операционной системе.
Каждый раз, когда я запускал его, ОС создавала сообщение об ошибке.
Таким образом, проблема не в C #, а в том, что ошибка, которая не обрабатывается кодом пользователя, больше не находится под контролем приложения , и поэтому среда выполнения (я полагаю) не может форсировать шаблон выполнения в теме.
Если бы вы создали приложение формы Windows и записали все свои сообщения в текстовое поле (а затем сразу же сбросили их) вместо прямой записи в консоль, вы бы вообще не увидели это сообщение об ошибке, потому что оно было вставлено в консоль ошибок вызывающим приложением, а не собственным кодом.
РЕДАКТИРОВАТЬ
Я постараюсь выделить ключевую часть этого. Необработанные исключения находятся вне вашего контроля, и вы не можете определить, когда будет выполнен их обработчик исключений. Если вы поймаете исключение в какой-то момент в вашем приложении, тогда блоки finally
будет выполняться перед блоком catch
, находящимся ниже в стеке.