Подтвердить что ты не робот

Как регистрировать все брошенные исключения?

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

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

4b9b3361

Ответ 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.