Я хочу уловить все исключения, поднятые (обработанные или необработанные) для их регистрации. для необработанного я использую ThreadExceptionEventHandler и UnhandledExceptionEventHandler, но я хочу поймать и исключения, которые находятся в блоке try catch с или без (исключение e). Можно ли наследовать класс исключений для создания общего события?
Catch All (обработано или необработано) Исключения
Ответ 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; }
чтобы повторно исключить исключение, которое будет в конечном итоге поймано и зарегистрировано как исключение без обработки.
Ответ 4
С++ допускает catch(...)
, который ловит все исключения, но на самом деле не позволяет анализировать их по глубине. (см. с помощью catch (...) (эллипсиса) для посмертного анализа)
Я не уверен, что он будет работать на С#.
Ответ 5
Нет, это невозможно.
Единственный способ, которым это было бы возможно, - использовать API отладки (управляемая версия называется mdbg)
Ответ 6
Невозможно поймать уже пойманное исключение, за исключением, может быть, работы с AddVectoredExceptionHandler.
Сказав это, вы можете использовать подход catch-and-rethrow:
catch(Exception e) {
Logger.Log(e);
throw;
}
или
catch(Exception e) {
bool rethrow = LoggerStrategy.Log(e);
if(rethrow) { throw; }
}
Еще лучше, используйте Блок приложений ведения журнала.