Аннотирование исключений дополнительной информацией без их отлова - PullRequest
6 голосов
/ 22 ноября 2011

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

  • Я не хочу try{...}catch{... throw;}, поскольку это считается перехватом исключения и затрудняет отладку (во время разработки я бы хотел, чтобы приложение остановилось, а отладчик среагировал, когда выдается исходное исключение, а не тогда, когда это самое необъяснимое исключение).Обработчики исключений первого шанса не являются обходным решением, поскольку, к сожалению, слишком много ложных срабатываний.
  • Я бы хотел избежать чрезмерных накладных расходов в обычном, неисключительном случае.

Есть ли способ сохранить ключевые фрагменты контекста (например, обрабатываемое имя файла или что-то еще) в исключении таким образом, чтобы не перехватить исключение?

Ответы [ 3 ]

1 голос
/ 23 ноября 2011

Нет ничего плохого в следующем шаблоне:

try
{
    // Do Something
}
catch (GeneralException ex)
{
    throw new SpecificException(
        String.Format("More specifics ({0}) in message", someData),
        moreContext,
        new {even, more, context},
        ex);
}

Это именно тот шаблон, который нужно использовать, например, когда «Делай что-то», скажем, для открытия какого-либо файла. «SpecificException» может быть «не могу прочитать файл конфигурации».

1 голос
/ 22 ноября 2011

Я стреляю в это здание по предложению Адама об Aop.мое решение было бы Unity, а не postsharp, и единственный вопрос, который у меня возник бы, заключается в том, перехватывается ли исключение внутри invoke, что, скорее всего, ...

        public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
        //execute
        var methodReturn = getNext().Invoke(input, getNext);

        //things to do after execution
        if (methodReturn.Exception != null)
            methodReturn.Exception.Data.Add("filename", "name of file");

        return methodReturn;
    }
}
0 голосов
/ 23 ноября 2011

Я бы не использовал AOP для отлова исключений.Вместо этого я бы использовал класс перехвата для LOG исключения + все аргументы метода, который вызвал исключение.А затем позвольте исходному исключению быть брошенным снова

...