Если я правильно читаю здесь между строк, проблема в том, что ваше исключение эффективно «исчезает», хотя поведение отладчика по умолчанию должно нарушаться при необработанных исключениях.
Если у вас есть асинхронные методы, вы можете столкнуться с этой проблемой, потому что исключения, не перехваченные в потоке пула потоков как часть продолжения задачи, не считаются необработанными исключениями. Скорее они проглатываются и хранятся вместе с Задачей.
Например, взгляните на этот код:
class Program
{
static void Main(string[] args)
{
Test();
Console.ReadLine();
}
private async static Task Test()
{
await Task.Delay(100);
throw new Exception("Exception!");
}
}
Если вы запустите эту программу с настройками отладчика по умолчанию (останавливать только на необработанных исключениях), отладчик не сломается. Это связано с тем, что поток пула потоков, выделенный для продолжения, проглатывает исключение (передает его экземпляру задачи) и освобождает себя обратно в пул.
Обратите внимание, что в этом случае настоящая проблема заключается в том, что Task
возвращаемый объект Test()
никогда не проверяется. Если в вашем коде есть аналогичные типы логики «запустил и забыл», вы не увидите исключения в момент их создания (даже если они «не обрабатываются» внутри метода); исключение появляется только тогда, когда вы наблюдаете за Задачей, ожидая ее, проверяя ее Результат или явно просматривая ее Исключение.
Это всего лишь предположение, но я думаю, что вы, вероятно, наблюдаете что-то подобное.
Tool
или неWindow
будут все нужные места. В вашем случае вы ищете настройки исключений .