Rozważ ten mały program. Zignorować, jeśli będzie ogólny połów, ja trzymał go krótko, aby spróbować zilustrować punkt:Dlaczego przechwycić metodę obsługującą działanie obcięcie śledzenia stosu?
private static void Main(string[] args)
{
Try(Fail);
}
private static void Fail()
{
var x = ((string)null).Clone();
}
private static void Try(Action action)
{
try
{
action();
}
catch (Exception exc)
{
Debug.WriteLine(exc.StackTrace);
}
}
Po uruchomieniu następujące (niektóre z informacji ścieżki usunięty) jest produkowany:
at Scratch.Program.Fail() in Program.cs:line 27
at Scratch.Program.Try(Action action) in Program.cs:line 34
Moje pytanie brzmi: dlaczego śledzenie stosu wyjątku powoduje zatrzymanie rozwijania łańcucha metod przy metodzie Try()
? Spodziewam się, że rozwinie się to po metodzie Main()
.
Nie udało mi się znaleźć żadnej dokumentacji na temat tego, co powstrzymuje wyjątek od rozwijania się po przejściu obok Try()
- więc chciałbym to zrozumieć.
Łapiesz wyjątek w 'Try()', jeśli złapałeś go w 'Main()', to tam kończy się ślad stosu. –
To w rzeczywistości nie ma nic wspólnego z 'Akcja', zdarza się, nawet jeśli po prostu masz' Try' zadzwoń 'Fail' bezpośrednio: http://ideone.com/X9JQFS –