Warunki, gdy w końcu nie wykonuje się w a.net spróbuj..wreszcie blok

W zasadzie słyszałem, że pewne warunki spowodują, że. NET przejdzie obok ostatniego bloku. Czy ktoś wie jakie są te warunki?

Author: NotMe, 2008-09-21

6 answers

Dwie możliwości:

Blok finally nie zostanie wykonany, gdy jest StackOverflowException, ponieważ nie ma miejsca na stos, aby wykonać więcej kodu. Nie będzie również wywoływany, gdy istnieje ExecutionEngineException, które mogą wynikać z wywołania do Environment.FailFast().

 47
Author: Haacked,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-10 18:32:33

Chyba, że CLR wybuchnie i spadnie z wykonywalnym ExecutingEngineException (widziałem kilka w .Net 1.1 dni z odpowiednią ilością COM Interop:).. Myślę, że w końcu powinien Zawsze wykonać.

 14
Author: Gishu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 18:21:28

Można uzyskać sytuację, w której kod w bloku try powoduje wyrzucenie SecurityException przed wprowadzonym blokiem try (zamiast tego wyjątek jest wyrzucany, gdy wywołana jest metoda zawierająca (zobacz http://msdn.microsoft.com/en-us/library/fk6t46tz (VS. 71).aspx)), w tej sytuacji nigdy nie wpisujesz bloku try, więc kod w bloku finally nigdy nie zostanie wywołany.

Inne możliwości to StackOverflowException i ExecutingEngineException.

 5
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 18:37:10

Finally blok na background thread może nie zostać wykonany. Zależy to jednak od zakończenia operacji main foreground thread, która kończy operację background thread jeszcze przed całkowitym wykonaniem 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");
        }
    }
}
 3
Author: Navneet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 12:29:45

Istnieje również aplikacja.Metoda wyjścia.

 1
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-20 20:29:52

Ani kod, który podąża za blokiem finally, ani kod w zewnętrznych zakresach, nie będą wykonywane bez pierwszego uruchomienia bloku finally (wyjątek w obrębie bloku finally może spowodować jego przedwczesne zakończenie, w którym to przypadku wykonanie wyskoczy z finalizera do zewnętrznego zakresu). Jeśli kod przed blokiem finally utknie w niekończącej się pętli lub metodzie, która nigdy się nie kończy, lub jeśli kontekst wykonania zostanie całkowicie zniszczony, blok finally nie zostanie wykonany.

Zauważ, że w przeciwieństwie do metod "Finalize" (lub "destruktorów" w języku C#), na których nie należy polegać.

 0
Author: supercat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-21 20:03:22