Considera questo piccolo programma. Ignora, se si vuole, la cattura generica, ho mantenuto essere breve per cercare di illustrare il punto:Perché il catch in un metodo di gestione di un'azione tronca la traccia dello stack?
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);
}
}
Quando run, il seguente (con alcune delle informazioni percorso rimosso) viene prodotto:
at Scratch.Program.Fail() in Program.cs:line 27
at Scratch.Program.Try(Action action) in Program.cs:line 34
La mia domanda è: perché la traccia dello stack dell'eccezione smette di srotolare la catena del metodo nel metodo Try()
? Mi aspetterei che si svolgesse al di fuori del metodo Main()
.
Non sono stato in grado di trovare alcuna documentazione su ciò che impedisce l'interruzione delle eccezioni andando oltre lo Try()
- quindi mi piacerebbe capirlo.
Si sta rilevando l'eccezione in 'Try()', se la si è rilevata in 'Main()', allora è dove finisce la traccia dello stack. –
Questo in realtà non ha nulla a che fare con 'Action', succede anche se hai solo' Try' call 'Fail' direttamente: http://ideone.com/X9JQFS –