Поймать все (обработанные или необработанные) исключения - PullRequest
1 голос
/ 06 мая 2010

Я хочу перехватить все сгенерированные исключения (обработанные или необработанные) для их регистрации. для необработанных я использую ThreadExceptionEventHandler и UnhandledExceptionEventHandler, но я хочу ловить и исключения, которые находятся в блоке try catch с или без (исключение e) Можно ли наследовать класс исключений для создания общего события?

Ответы [ 6 ]

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

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

Позвоните AddVectoredExceptionHandler, чтобы добавить свой собственный обработчик. Вы получите вызов сразу после возникновения исключения: либо явным throw / __CxxThrowException / RaiseException, либо неявно процессором (нарушение доступа или т. Д.)

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

1 голос
/ 06 мая 2010

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

Если бы вы захотели попробовать это, вам нужно было бы заменить весь код обработки исключений и, возможно, добавить еще чанк. Я не думаю, что это было бы значительно лучше, чем подход Питера Макга, но он мог бы позволить вам использовать различные варианты при сохранении и проверке исходных исключений и повторном выбрасывании, например, ведение записи о том, было ли оно уже зарегистрировано ниже цепь.

Просто чтобы быть в явном виде, можно использовать:

catch (Exception e)
{
   log(e);
   throw;
}

, который отбросит исходное исключение.

1 голос
/ 06 мая 2010

C ++ допускает catch(...), который перехватывает все исключения, но не позволяет их глубоко анализировать. (см. использование catch (...) (многоточие) для посмертного анализа ) Я не уверен, что это будет работать в C #, хотя.

1 голос
/ 06 мая 2010

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

catch (Exception e) {}

и вызовите ту же функцию регистрации с экземпляром.

Если нет, и у вас действительно должны быть какие-то случаи, когда у вас есть ловушка, но без ловли экземпляра вы можете использовать ...

catch { throw; }

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

0 голосов
/ 06 мая 2010

Нет способа поймать уже перехваченное исключение, кроме работы с AddVectoredExceptionHandler.

Сказав это, вы можете использовать подход «поймать и отбросить»:

catch(Exception e) {
   Logger.Log(e);
   throw;
}

или

catch(Exception e) {
   bool rethrow = LoggerStrategy.Log(e);
   if(rethrow) { throw; }
}

Еще лучше, используйте Блок приложения регистрации.

0 голосов
/ 06 мая 2010

Нет, это невозможно.

Единственный способ, которым это возможно, - это использование API отладки ( управляемая версия называется mdbg )

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