Последовательность вывода при работе с исключениями

При вызове Bar строки появятся в порядке Dispose!, Oh, no!, Finally. Освобождение ресурса через using происходит до внешнего catch.

Короткий ответ

Что ответить на собеседовании

При вызове Bar строки появятся в порядке Dispose!, Oh, no!, Finally. Освобождение ресурса через using происходит до внешнего catch.

Подробный разбор

Ответ с пояснениями

Условие

Какой будет порядок вывода в консоль при вызове метода E.Bar()?\ncsharp\nclass E : IDisposable\n{\n public void Dispose() => Console.WriteLine(\"Dispose!\");\n\n public void Foo() => throw new Exception(\"Oh, no!\");\n\n public static void Bar()\n {\n try\n {\n using (var e = new E())\n {\n e.Foo();\n }\n }\n catch (Exception ex)\n {\n Console.WriteLine(ex.Message);\n }\n finally\n {\n Console.WriteLine(\"Finally\");\n }\n }\n}\n

Ответ

При вызове Bar строки появятся в порядке Dispose!, Oh, no!, Finally. Освобождение ресурса через using происходит до внешнего catch.

После исключения в Foo управление покидает using. Его скрытый finally вызывает Dispose, затем внешний catch печатает сообщение исходного исключения. В конце исполняется внешний finally.

Dispose!
Oh, no!
Finally

Это предполагает, что Dispose сам не выбрасывает исключение, как и в условии. Иначе catch увидит исключение освобождения ресурса. Обратные слеши и символы \n в исходной записи следует понимать как повреждённое оформление многострочного C#-примера.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее