Catch All (обработано или необработано) Исключения

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

Ответ 1

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

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

Чтобы быть явным, можно использовать:

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

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

Ответ 2

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

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

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

Ответ 3

Похоже, что у вас есть необработанные исключения, насколько это возможно, для обработанных исключений вы не можете в конце концов...

catch (Exception e) {}

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

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

catch { throw; }

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

Ответ 6

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

Сказав это, вы можете использовать подход catch-and-rethrow:

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

или

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

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