В основном я слышал, что определенные условия вызовут .net, чтобы пропустить последний блок. Кто-нибудь знает, что это за условия?
Условия, когда, наконец, не выполняются в блоке .net try..finally
Ответ 1
Две возможности:
Блок finally не будет выполняться, когда есть StackOverflowException
, так как в стеке нет места, чтобы даже выполнить какой-либо код. Он также не будет вызываться, когда существует ExecutionEngineException
, который может возникнуть при вызове Environment.FailFast()
.
Ответ 2
Если CLR не взорвется и не спустится с ExecutingEngineException (я видел несколько в .net 1.1 дней с нужным количеством COM Interop:).. Я думаю, что в конце концов должно всегда выполнить.
Ответ 3
Вы можете получить ситуацию, когда код в блоке try вызывает сброс SecurityException до ввода блока try (вместо этого исключение вызывается при вызове метода contains (см. http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx)), в этой ситуации вы даже не входите в блок try, поэтому код в блоке finally никогда не вызывается.
Другие возможности включают StackOverflowException и ExecutingEngineException.
Ответ 4
Finally
block on background thread
может не выполняться. Однако это зависит от завершенного выполнения main foreground thread
, который завершает операцию background thread
еще до полного выполнения background thread
.
class Program
{
static void Main(string[] args)
{
Program prgm = new Program();
Thread backgroundThread = new Thread(prgm.CheckBgThread);
backgroundThread.IsBackground = true;
backgroundThread.Start();
Console.WriteLine("Closing the program....");
}
void CheckBgThread()
{
try
{
Console.WriteLine("Doing some work...");
Thread.Sleep(500);
}
finally
{
Console.WriteLine("This should be always executed");
}
}
}
Ответ 5
Существует также метод Application.Exit.
Ответ 6
Ни один код, который следует за блоком finally, или код во внешних областях, не будет выполняться без первого запуска блока finally (исключение в блоке finally может привести к его преждевременному завершению, и в этом случае выполнение выскочит из финализатор для внешнего охвата). Если код до блока finally застревает в бесконечном цикле или методе, который никогда не выходит, или если контекст выполнения полностью уничтожен, блок finally не будет выполняться.
Обратите внимание на то, что в конечном итоге блокировать, в отличие от методов "Finalize" (или С# "деструкторов" ), на которые не следует полагаться должным образом.