2015-06-04 2 views
-2

У меня есть базовая структура, предназначенная для устранения ошибок в общем случае; однако, когда возникает ошибка, я, кажется, не поймаю ее в своих рамках. Следующий код представляет собой упрощенную версию того, что я пытаюсь достичь:Обработка ошибок асинхронного анонимного метода

Что происходит, когда вы запустите приведенный выше код он падает на деление на ноль. Я пытаюсь заставить его написать сообщение отладки и продолжить.

У меня есть перерыв на необработанных исключениях только помечается.

Мои исключения настройки:

enter image description here

Что IDE выглядит, когда он ломает:

enter image description here

+2

Все, что вы «под флагом» не то, что вы думаете. Мой хрустальный шар говорит, что вы отметили флажок «Бросок» в диалоговом окне «Отладка»> «Исключения». Это заставляет отладчик останавливаться, когда генерируется исключение, прежде чем он достигнет блока * catch *. Вам нужно будет решить настоящую ошибку в этом коде, ваша программа закончится до завершения задачи. –

+0

Я не раз проверял, что у меня нет этого флага. И когда задача заканчивается, в этом примере принципиально не имеет значения, потому что это ошибки - которые являются целью теста (код, на котором он основан, ожидает функция). –

+0

Вы не ожидаете завершения 'RunMethod', что означает, что ваш приложение уже завершается к тому времени, когда вы делите на ноль. –

ответ

0

Вы никогда не ждут RunMethod, чтобы закончить выполнение так что приложение не имеет никаких шансов улавливать и обрабатывать исключение. Он уже завершен и находится на стадии очистки.

Просто измените код:

RunMethod<decimal>(() => 
     { 
      decimal x = 0; 
      decimal y = 1/x; 
      return y; 
     }).Wait(); 

и обработчик исключений будет работать, как ожидалось.

Фактически, компилятор выдает предупреждение об этом. Такие инструменты, как ReSharper, также будут жаловаться и отмечать вызов.

Сделав это изменение, выполнение войдет в обработчик исключений. В консоли ничего не появится, но в окне вывода Visual Studio появится слово Error.

Чтобы показать сообщение об ошибке в консоли, обработчик исключений должен измениться:

catch (DivideByZeroException ex) 
    { 
     Console.WriteLine("Error"); 
     return default(T); 
    } 
+0

Это не имеет значения –

+0

Что это значит? Выполнение этого приведет к выполнению ввода обработчика исключений. Если бы вы написали 'Console.WriteLine' вместо' System.Diagnostics.Debug.WriteLine', вы увидите сообщение в консоли. Как бы то ни было, сообщение появится в окне вывода Visual Studio –

+0

Я запустил его, и это не так. Чтобы быть ясным, я ожидаю, что код войдет в блок catch, а затем вернется, не вызывая ошибки. В его нынешнем виде отладчик ломается у дайвера с нулевой ошибкой –

Смежные вопросы