Простое консольное приложение в Visual Studio 2019, .Net Framework 4.7, Windows:
static void Main(string[] args)
{
try
{
Console.WriteLine("In try");
throw new IndexOutOfRangeException();
}
finally
{ *// Surprisingly this part is not being executed.*
Console.WriteLine("In finally");
Console.ReadLine();
}
}
Я был уверен, что блок finally вызывается как в случае NO Exception, так и в случае YES Exception. Я читал в документах:
Однако, если исключение не обрабатывается, выполнение блока finally зависит от того, как запускается операция очистки исключения. Это, в свою очередь, зависит от того, как настроен ваш компьютер.
Ссылка Что ж, я смущенный. Мне нужно что-то с этой операцией размотки, чтобы, наконец, было вызвано в случае необработанных исключений?
catch
, который улавливает все исключения? - person sommmen   schedule 30.11.2020The goal is that finally block will run no matter if there was an exception or not (handled or unhandled)
Вы не можете по определению. Если бы это было возможно, тогда это было бы гарантировано. Но это не гарантируется. Хорошо, теоретически это могло бы работать, даже если это не было гарантировано - но даже если бы это было так, вы не могли полагаться на его работу в будущем. - person mjwills   schedule 30.11.2020so what should we do in order to run the finally block in case of an Unhandled exception?
Поймай его - чтобы повысить вероятность того, что он не останется без внимания. - person mjwills   schedule 30.11.2020finally
будет работать, если вы, например, отключите / выключите компьютер во время выполнения кодаtry
. - person SᴇM   schedule 30.11.2020finally
. - person SᴇM   schedule 30.11.2020even this is not promised...
Правильно. - person mjwills   schedule 30.11.2020@Fildor, yes by the word "promised", I meant "any way" Unhandled exceptions or handled.
По определению вы знаете, что это не может работать, не на 100% - например, для переполнения стека. Таким образом, вы имеете дело с степенью уверенности, а не с абсолютной уверенностью. - person mjwills   schedule 30.11.2020And I didn't even understand what configs I need to change in my machine in order the finally block will be called in such a case,
Кто сказал, что это связано с конфигурацией (я не вижу этого в документации)? Если вы хотите, чтобы вероятность выполнения была выше - добавьтеcatch
. - person mjwills   schedule 30.11.2020but I thought that at least in simple cases
И это действительно так, в простых случаях. Верх стека вызовов (например, Main) - спорно, просто ли это в таком случае. - person mjwills   schedule 30.11.2020catch
(и его использование не задокументировано). Вы можете проверить это, чтобы подтвердить это. dotnetfiddle.net/KIabGl - person mjwills   schedule 30.11.2020So how can we be sure the Dispose() is going to be called?
Ты не можешь. Как я уже говорил ранее. - person mjwills   schedule 30.11.2020there is not really a point
Иногда ремни безопасности не помогают пережить аварию. И все же я ношу один. Почему? Потому что обычно это так. Есть ограниченные ситуации, когда вам нужен улов. Если для вас это важно, используйте уловку в этих сценариях. - person mjwills   schedule 30.11.2020