Как правильно обрабатывать (регистрировать) пользовательские исключения? - PullRequest
1 голос
/ 21 октября 2011

Ситуация, когда метод пытается зарегистрировать пользовательское исключение (пользовательский класс исключений в качестве примера кода), вызывает проблему:

[Serializable]
public class CustomException : Exception
{
    public CustomException() { }
    public CustomException(string message) : base(message) { }
    public CustomException(string message, Exception inner) : base(message, inner) { }
    protected CustomException(
      System.Runtime.Serialization.SerializationInfo info,
      System.Runtime.Serialization.StreamingContext context)
        : base(info, context) { }
}

Создание исключения:

CustomException ex = new CustomException("Here is a new custom exception! ");
LogError(ex);

Метод регистрации исключений (пользовательских и других!):

public static void LogError(Exception ex)
{
    //Saving exception messages, inner exceptions etc
    //...
}

В этом случае ex.Stacktrace пользовательского исключения является нулевым при его регистрации!

Я считаю, что причина в том, что метод ведения журнала (который пытается быть методом общего назначения) принимает объект Exception в качестве параметра, а не CustomException (?). Как правильно создать метод ведения журнала, поскольку его перегрузка различными типами исключений кажется немного нелогичной?

Ответы [ 4 ]

2 голосов
/ 21 октября 2011

Я считаю, что причина в том, что метод ведения журнала (который пытается быть методом общего назначения) принимает объект Exception в качестве параметра, а не CustomException (?)

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

Трассировка стека генерируется, когда исключение перемещается по стеку вызовов.Бросив исключение в тот же метод, в который вы его перехватили, создаст только один элемент трассировки стека.

1 голос
/ 21 октября 2011

Бросьте экземпляр CustomException перед его регистрацией. Среда выполнения заполнит информацию о трассировке стека

1 голос
/ 21 октября 2011
  1. Записать исключения в блоке перехвата
  2. Проверить уровень ведения журнала и записать в журнал только сообщение или полную информацию об исключениях.

Например, мы используем методы расширения для TraceSource для регистрации исключений:

public static void TraceException(this TraceSource traceSource, Exception ex)
{
    traceSource.TraceException(string.Empty, ex);
}

public static void TraceException(this TraceSource traceSource, string comment, Exception ex)
{
    if (!string.IsNullOrWhiteSpace(comment))
        comment += "\r\n";

    traceSource.TraceEvent(TraceEventType.Error, (int)TraceEventType.Error,
            comment + "ExceptionType: {0} \r\n ExceptionMessage: {1}", ex.GetType(), ex.Message);

    if (traceSource.Switch.Level == SourceLevels.Verbose ||
        traceSource.Switch.Level == SourceLevels.All)
    {
        traceSource.TraceEvent(TraceEventType.Verbose, 0, ex.ToString());
    }
}

Использование:

catch(Exception ex)
{
    _log.TraceException(ex);
}
1 голос
/ 21 октября 2011

Вы можете использовать:

public static void LogError<T>(T exception)
{
  // Serialize the exception here and write to log
}

Обратите внимание, что вы можете просто использовать любой объект здесь в сочетании с читаемым человеком форматом сериализации (то есть отформатированным Json).Затем вы можете просто зарегистрировать сериализованное представление объекта, где будут сохранены все открытые поля / свойства.

Обратите внимание, что вам также понадобится throw / catch для построения стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...