Używam zdarzenia FirstChanceException do rejestrowania szczegółów dotyczących zgłaszanych wyjątków.Wyjątek AppDomain.FirstChanceException i przepełnienie stosu
static void Main(string[] args)
{
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
Console.WriteLine("Inside first chance exception.");
};
throw new Exception("Exception thrown in main.");
}
To działa zgodnie z oczekiwaniami. Ale jeśli zostanie zgłoszony wyjątek do obsługi zdarzenia, wystąpi przepełnienie stosu, ponieważ zdarzenie zostanie podniesione rekursywnie.
static void Main(string[] args)
{
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
throw new Exception("Stackoverflow");
};
throw new Exception("Exception thrown in main.");
}
Jak radzić sobie z wyjątkami występującymi w ramach obsługi zdarzeń?
Edit:
Jest kilka odpowiedzi sugerujące, że zawinąć kod wewnątrz procedury obsługi zdarzenia w bloku try/catch, ale to nie działa, ponieważ zdarzenie jest wywoływane przed Wyjątkiem mogą być obsługiwane.
static void Main(string[] args)
{
AppDomain.CurrentDomain.FirstChanceException += (sender, eventArgs) =>
{
try
{
throw new Exception("Stackoverflow");
}
catch
{
}
};
throw new Exception("Exception thrown in main.");
}
Wystarczy użyć pola bool aby zapobiec rekursji. –
Nie rozumiem, dlaczego chcesz tego. Obsługiwane są wyjątki pierwszej szansy. Dlaczego, na Boga, rzuciłbyś jeszcze jednego? – leppie
Nie celowo wyrzucam innego. Co się stanie, jeśli próbuję zarejestrować ten błąd i zostanie zgłoszony wyjątek podczas próby zarejestrowania tych informacji? – nivlam