Избежание сообщений об исключениях первого шанса, когда исключение безопасно обработано - PullRequest
75 голосов
/ 12 сентября 2008

Следующий бит кода перехватывает исключение EOS

using (var reader = new BinaryReader(httpRequestBodyStream)) {

    try {
        while (true) {
            bodyByteList.Add(reader.ReadByte());
        }
    } catch (EndOfStreamException) { }
}

Так почему я по-прежнему получаю исключения из первого шанса в моей консоли?

Первое случайное исключение типа «System.IO.EndOfStreamException» произошло в mscorlib.dll

Есть ли способ скрыть эти сообщения об исключениях первого шанса?

Ответы [ 9 ]

189 голосов
/ 13 сентября 2008

Чтобы не видеть сообщения, щелкните правой кнопкой мыши окно вывода и снимите флажок «Сообщения об исключениях».

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

78 голосов
/ 12 сентября 2008

Смысл исключений «первого шанса» заключается в том, что вы видите их как обработчик, так что вы можете остановиться на них во время отладки в момент выдачи. «Вторым шансом» является исключение, которое не имеет соответствующего обработчика. Иногда вы хотите поймать исключения «первого шанса», потому что важно видеть, что происходит, когда его бросают, даже если кто-то его ловит.

Не о чем беспокоиться. Это нормальное поведение.

19 голосов
/ 12 сентября 2008

1) В Visual Studio вы можете изменить настройки способа, которым отладчик обрабатывает (включается) исключения.

Перейдите в раздел «Отладка»> «Исключения». (Обратите внимание, что это может отсутствовать в вашем меню в зависимости от настроек среды Visual Studio. Если не просто добавить его в меню с помощью меню «Настройка».)

Там вы видите диалог исключений и когда их нарушать.

В строке «Общеязыковые исключения во время выполнения» вы можете отменить выбор метода throw (который затем перестанет беспокоить вас об исключениях первого шанса), а также, если хотите, отменить выбор без использования пользователем (что я бы не рекомендовал). *

2) Получаемое сообщение не должно находиться в консоли, а должно отображаться в окне «Вывод» Visual Studio. Если это так, то я не нашел возможности удалить это, но он не появляется, если вы запускаете приложение без Visual Studio.

Надеюсь, это поможет.

11 голосов
/ 12 сентября 2008

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

Мало того, что вы избежите беспорядка в окне консоли, ваша производительность улучшится, и это сделает счетчики производительности, подобные исключениям .NET CLR, более значимыми.

В этом примере вы бы использовали

while (reader.PeekChar() != -1)
{
    bodyByteList.Add(reader.ReadByte());
}
7 голосов
/ 26 октября 2012

У меня была эта проблема, и я не мог понять, где было выброшено исключение. Таким образом, мое решение состояло в том, чтобы позволить Visual Studio прекратить выполнение при таком исключении.

  1. Перейдите к «Отладка / Исключения»
  2. Разверните дерево «Общих исключений во время выполнения».
  3. Разверните ветку "Система".
  4. Прокрутите вниз до значения NullReferenceException и проверьте отметьте «throw» и снимите флажок «hand-handled».
  5. Отладка вашего проекта.
4 голосов
/ 18 апреля 2014

Если вы хотите больше контроля над этими сообщениями, вы можете добавить обработчик:

Friend Sub AddTheHandler()
AddHandler AppDomain.CurrentDomain.FirstChanceException, AddressOf FirstChanceExceptionHandler
End Sub

<Conditional("DEBUG")>
Friend Sub FirstChanceExceptionHandler( source As Object,  e As Runtime.ExceptionServices.FirstChanceExceptionEventArgs)
' Process first chance exception

End Sub

Это позволяет вам замолчать их, как упомянуто в других комментариях, но при этом гарантирует, что вы в состоянии о них знать. Я считаю, что было бы хорошо увидеть, сколько я действительно выбрасываю, если я записываю сообщение и метку времени в текстовый файл.

2 голосов
/ 10 мая 2010

На самом деле, если у вас есть много исключений в секунду, вы должны достичь лучшей производительности, проверив значение reader.EndOfStream-value. Распечатка этих сообщений об исключениях невероятно медленная, и скрытие их в visual studio ничего не ускорит. 1001 *

0 голосов
/ 08 августа 2009

в VB.NET:

<DebuggerHidden()> _
Public Function Write(ByVal Text As String) As Boolean
   ...
0 голосов
/ 12 сентября 2008

Я думаю, что поток генерирует это исключение, поэтому ваша попытка ограничена, чтобы поймать его.

Добавляйте еще несколько комбинаций try catch по разным областям действия, пока не поймаете его там, где он фактически генерируется, но, похоже, это происходит либо вне нашего использования, так как объект потока не создается в области применения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...