Jeśli poprawnie czytam między wierszami w tym miejscu, problem polega na tym, że Twój wyjątek skutecznie `` znika '', mimo że domyślne zachowanie debugera powinno zostać przerwane w przypadku nieobsłużonych wyjątków.
Jeśli masz metody asynchroniczne, możesz napotkać ten problem, ponieważ wyjątki, które nie zostały przechwycone w wątku puli wątków jako część kontynuacji zadania, nie są uznawane za nieobsłużone wyjątki. Są raczej połykane i przechowywane wraz z Zadaniem.
Na przykład spójrz na ten kod:
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
private async static Task Test()
{
await Task.Delay(100);
throw new Exception("Exception!");
}
}
Jeśli uruchomisz ten program z domyślnymi ustawieniami debugera (zatrzymaj tylko w przypadku nieobsługiwanych wyjątków), debuger nie ulegnie awarii. Dzieje się tak, ponieważ wątek puli wątków przydzielony do kontynuacji połyka wyjątek (przekazując go do wystąpienia zadania) i zwalnia się z powrotem do puli.
Zauważ, że w tym przypadku prawdziwym problemem jest to, że Task
zwracany przez Test()
nigdy nie jest sprawdzany. Jeśli masz podobny typ logiki „wystrzel i zapomnij” w swoim kodzie, nie zobaczysz wyjątków w momencie ich wyrzucenia (nawet jeśli są one „nieobsługiwane” w metodzie); wyjątek pojawia się tylko wtedy, gdy obserwujesz zadanie, czekając na nie, sprawdzając jego wynik lub jawnie patrząc na jego wyjątek.
To tylko przypuszczenie, ale myślę, że prawdopodobnie obserwujesz coś takiego.
Tool
lub nieWindow
będzie zawierała wszystkich żądanych lokalizacji. W twoim przypadku szukasz ustawień wyjątków .