Как регистрировать все брошенные исключения?
Как регистрировать все исключения, которые были выбраны и выхвачены? Что-то вроде Visual Studio IntelliTrace. Или есть способ интегрировать InteliTrace в отладочную версию приложения, а затем просмотреть его журналы?
Обновление: Я немного разъясню это. Я хочу стандартные .txt(или любые пользовательские) журналы, формат не имеет значения. Главное, что я хочу регистрировать все исключения, которые произошли во всех сторонних библиотеках, не добавляя к ним код.
Ответы
Ответ 1
Я предполагаю, что функция, которую вы ищете, называется FirstChanceException
и может быть доступна через
Событие AppDomain.FirstChanceException
По сути, это событие обеспечивает привязку для получения информации о любом (управляемом) исключении, получаемом в AppDomain
.
Вы можете не обрабатывать исключение таким образом! Это лишь своего рода уведомление
Обновление:
относительно вашего комментария о "проглоченном исключении" на другом ответе - и просто выстрел в темноту:
В x64 системах исключения, которые попадают в метод windows onLoad, не могут быть пойманы в вашем методе Main().
см. эту статью SO для справки
Обновление 2:
Что касается Threads
, я думаю, что вам придется реализовать его самостоятельно. Это будет связано с каким-то опросом и повредит производительности, но я думаю, что для отладки в большинстве случаев это нормально.
Это можно сделать, используя
var threads = Process.GetCurrentProcess().Threads;
Ответ 2
Вы можете пойти с аспектами. Если, например, вы берете PostSharp и записываете аспект, который создает try-catch для каждой функции, ведение журнала выполняется в аспекте. После регистрации просто снимите его.
Пример кода с их сайта, чтобы получить полный ответ с демо-кодом:
/// <summary>
/// Aspect that, when applied on a method, catches all its exceptions,
/// assign them a GUID, log them, and replace them by an <see cref="InternalException"/>.
/// </summary>
[Serializable]
public class ExceptionPolicyAttribute : OnExceptionAspect
{
/// <summary>
/// Method invoked upon failure of the method to which the current
/// aspect is applied.
/// </summary>
/// <param name="args">Information about the method being executed.</param>
public override void OnException(MethodExecutionArgs args)
{
Guid guid = Guid.NewGuid();
Trace.TraceError("Exception {0} handled by ExceptionPolicyAttribute: {1}",
guid, args.Exception.ToString());
throw new InternalException(
string.Format("An internal exception has occurred. Use the id {0} " +
"for further reference to this issue.", guid));
}
}
Edit:
Вы можете использовать любой регистратор, такой как log4net, NLog или корпоративная библиотека (мой предпочтительный способ ведения журнала и некоторые другие вещи). Но на самом деле это не задача. Задача - IMHO - ввести в проект вход в журнал с минимальным ручным кодированием.
Ответ 3
Для обработанных исключений вам, скорее всего, необходимо будет зарегистрировать их явно. Даже если это не так, семантически существует огромная разница в обработанных и необработанных исключениях.
Обработанные исключения больше не являются исключительной ситуацией. Кто-то написал код. Я знаю, как справиться с этим исключением и продолжить правильно после.
Для необработанных исключений смотрите Elmah
Ответ 4
К вашему процессу можно присоединить отладчик, например WinDbg, и заставить его сломать любые исключения CLR с первой вероятностью; это будет включать исключения из сторонней библиотеки. См. здесь для примера того, как это сделать.
Ответ 5
Вы можете использовать свою собственную систему ведения журнала или использовать стороннюю библиотеку с именем log4net.
Ответ 6
попробуйте использовать Log4Net - это отличный регистратор и много использовал в этих сценариях http://sourceforge.net/projects/log4net/
Ответ 7
Если ваша вещь является веб-вещью, вы можете использовать https://elmah.github.io/, чтобы автоматически регистрировать ошибки (даже не останавливая службу!)
Ответ 8
В качестве альтернативы Log4Net, предложенной некоторыми ребятами, вы также можете использовать NLog. Я не знаю различий между этими двумя решениями, я просто знаю, что я доволен NLog.