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?
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()
.
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ć.
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.
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");
}
}
}
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.
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ć.
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