Исключение в потоке (задача) не распространяется, как показано в примере - PullRequest
1 голос
/ 05 июня 2019

Пример кода из "C # 7.0 в двух словах", с.580:

        Task task = Task.Run(() => { throw null; });
        try
        { 
            task.Wait(); 
        }
        catch (Exception ex)
        { }

выполнено в моем VS2017, не работает так, как описано в книге. При запуске из среды IDE System.NullReferenceException немедленно выбрасывается (и выполнение останавливается) в первой строке, тогда как в примере предполагается, что исключение выдается внутри запущенного потока и ожидает там, пока кто-то не вызовет Wait() или не прочитает Result на Task объекте. На стр.277 класс Task кратко объяснен, и есть довольно неясное упоминание пула потоков , который может использоваться. Я предполагаю, что в моем случае он не используется, и вместо этого основной поток выполняет лямбда, поэтому генерируется необработанное исключение. Я не смог найти подсказку о том, как или где настроить поведение пула потоков или класса Task. Или я скучаю по чему-то совершенно другому?

1 Ответ

3 голосов
/ 05 июня 2019

Вероятно, вы видите перерыв в отладчике в момент, когда исключение составляет выброс :

Debugger broken on thrown

Недостаток в том, что в диалоговом окне написано «Исключение выброшено», а оператор throw выделен желтым цветом.

По умолчанию отладчик прерывается, когда выбрасывается любое исключение внутри вашего кода, независимо от того, перехвачено ли оно позднее (или, если у вас отключен Just My Code, когда выбрасывается любое исключение в любом месте).

Это можно изменить, щелкнув ссылку «Открыть настройки исключений» в диалоговом окне или перейдя в «Отладка -> Windows -> Настройки исключений» и сняв флажок «Общеязыковые исключения во время выполнения».

Exception Settings

Вы также можете точно определить, на какие исключения будет работать отладчик. В диалоговом окне «Исключение исключения» можно также снять флажок «Разрывать при возникновении этого типа исключения», чтобы в будущем остановить прерывание отладчика для этого типа исключения.

Когда вы поймете, что хотите снова включить прерывание для набора исключений по умолчанию, в верхней части настроек исключений есть удобная кнопка сброса:

Exception Settings Reset

...