Условия, когда, наконец, не выполняется в блоке .net try..finally - PullRequest
45 голосов
/ 21 сентября 2008

В основном я слышал, что при определенных условиях .net будет проходить мимо блока finally. Кто-нибудь знает, что это за условия?

Ответы [ 6 ]

49 голосов
/ 21 сентября 2008

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

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

15 голосов
/ 21 сентября 2008

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

6 голосов
/ 21 сентября 2008

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

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

4 голосов
/ 21 ноября 2016

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");
        }
    }
}
2 голосов
/ 20 декабря 2008

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

0 голосов
/ 22 сентября 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...