Как записать все сгенерированные исключения? - PullRequest
25 голосов
/ 16 августа 2011

Как регистрировать любые исключения, которые были выброшены и перехвачены? Что-то вроде IntelliTrace в Visual Studio. Или есть способ интегрировать InteliTrace в отладочную версию приложения и затем просматривать его журналы?

Обновление: Я поясню это немного. Я хочу стандартные .txt (или любые другие) журналы, формат не имеет значения. Суть в том, что я хочу регистрировать все исключения, которые произошли во всех сторонних библиотеках, без добавления к ним кода.

Ответы [ 8 ]

28 голосов
/ 16 августа 2011

Я полагаю, что функция, которую вы ищете, называется FirstChanceException и может быть доступна через событие AppDomain.FirstChanceException

По сути, это событие предоставляет ловушку для получения информации о * 1006.* любое (управляемое) исключение, которое выдается в AppDomain.Вы можете не обработать исключение таким образом!Это всего лишь своего рода уведомление


Обновление: относительно вашего комментария о «проглоченном исключении» в другом ответе - и просто выстрел в темноту:
В системах x64, возникающих при исключенияхметод onLoad для Windows не может быть перехвачен в вашем методе Main ().
см. эту статью SO для справки


Обновление 2: Что касается Threads Я думаючто вам придется реализовать это самостоятельно.Это потребует какого-то опроса и повредит производительности, но я думаю, что для отладки в большинстве случаев все в порядке.Это можно сделать с помощью

var threads = Process.GetCurrentProcess().Threads;
5 голосов
/ 16 августа 2011

Вы можете пойти с аспектами.Например, если вы берете PostSharp и пишете аспект, который создает попытку для каждой функции, регистрация выполняется в этом аспекте.После регистрации просто перебросьте его.

Пример кода с их сайта, чтобы получить полный ответ с демо-кодом:

/// <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));
    }
}

Редактировать:

Вымог использовать любой регистратор, такой как log4net, NLog или корпоративную библиотеку (мой любимый способ ведения журналов и некоторые другие вещи).Но это не совсем задача здесь.Задача - ИМХО - внедрить вход в проект с как можно меньшим количеством ручного кодирования.

1 голос
/ 16 августа 2011

Вы можете подключить отладчик, такой как WinDbg, к вашему процессу и заставить его работать с ошибками при любых исключениях CLR первого шанса;это будет включать исключения в сторонней библиотеке.См. здесь для примера того, как это сделать.

1 голос
/ 16 августа 2011

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

Обработанные исключения больше не являются исключительной ситуацией.Кто-то пишет код сказал.Я знаю, как обработать это исключение и после него действовать правильно.

Для необработанных исключений взгляните на Elmah

1 голос
/ 16 августа 2011

попробуйте использовать Log4Net - это отличный регистратор и часто используется в этих сценариях http://sourceforge.net/projects/log4net/

0 голосов
/ 07 декабря 2017

Если ваша вещь в Интернете, вы можете использовать https://elmah.github.io/ для автоматической регистрации ошибок (даже без остановки службы!)

0 голосов
/ 16 августа 2011

В качестве альтернативы Log4Net, предложенной некоторыми парнями, вы также можете использовать NLog .Я не знаю различий между этими двумя решениями, я просто знаю, что доволен NLog.

0 голосов
/ 16 августа 2011

Вы можете использовать свою собственную систему регистрации или использовать стороннюю библиотеку с именем log4net.

...