2008-09-21 3 views

ответ

44

Две возможности:

Окончательно блок не будет выполняться, когда есть StackOverflowException так как нет места в стеке даже выполнять больше кода. Он также не будет вызываться, когда есть ExecutionEngineException, который может возникнуть в результате вызова до Environment.FailFast().

+3

Возможно, стоит отметить, что ExecutingEngineException может возникнуть из вызова Environment.FailFast() – 2010-01-11 11:55:46

+4

насчет OutOfMemoryException и ThreadAbortException? – 2012-02-09 13:49:13

14

тех пор, пока CLR не взрывается и идет вниз с ExecutingEngineException (я видел несколько в .net 1.1 дней с правильным количеством COM Interop :) .. Я думаю, что в конце концов должен всегда выполнить.

5

Вы можете получить такую ​​ситуацию, когда код в блоке try приведет к вызову SecurityException до ввода блока try (вместо этого исключение вызывается при вызове метода-метода (см. http://msdn.microsoft.com/en-us/library/fk6t46tz(VS.71).aspx)), в этой ситуации вы никогда не даже введите блок try, чтобы код в блоке finally никогда не вызывался.

Другие возможности включают StackOverflowException и ExecutingEngineException.

1

Существует также Application.Exit метод.

0

Ни один код, который следует за блоком finally или кодом во внешних областях, не будет выполняться без первого блока finally, который был запущен первым (исключение в блоке finally может привести к его преждевременному выходу, и в этом случае выполнение выскочит из финализатор к внешнему виду). Если код до блока finally застревает в бесконечном цикле или методе, который никогда не выходит, или если контекст выполнения полностью уничтожен, блок finally не будет выполняться.

Обратите внимание, что в конце концов блокировать, в отличие от методов «Finalize» (или C# «деструкторов», полагаться на блоки finally), на которые не следует должным образом полагаться.

3

Finally блок на 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"); 
     } 
    } 
} 
Смежные вопросы