Как преобразовать исключение в другое с помощью PostSharp? - PullRequest
0 голосов
/ 18 ноября 2009

Я хотел бы автоматически добавить следующий код вокруг тела некоторых методов:

try
{
   // method body
}
catch (Exception e)
{
   throw new MyException("Some appropriate message", e);
}

Я работаю с PostSharp 1.0, и вот что я сделал на данный момент:

public override void OnException(MethodExecutionEventArgs eventArgs)
{
    throw new MyException("Some appropriate message", eventArgs.Exception);
}

Моя проблема в том, что я могу видеть вызов PostSharp OnException в стеке.
Что было бы хорошей практикой, чтобы избежать этого и получить тот же стек вызовов, что и ручная реализация обработчика исключений?

Ответы [ 2 ]

2 голосов
/ 18 ноября 2009

Нет способа скрыть «OnException» из стека вызовов.

1 голос
/ 18 ноября 2009

Две вещи, работающие в тандеме, позволят вам сделать это:

  1. Тот факт, что Exception.StackTrace это virtual
  2. Использование параметра skipFrames для конструктора StackFrame. Это не обязательно, но облегчает задачу

В следующем примере показано, как настроить трассировку стека. Обратите внимание, что я не знаю способа настроить свойство Exception.TargetSite, которое по-прежнему предоставляет подробную информацию о методе, из которого возникло исключение.

using System;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // exception is reported at method A, even though it is thrown by method B
            MethodA();
        }

        private static void MethodA()
        {
            MethodB();
        }

        private static void MethodB()
        {
            throw new MyException();
        }
    }

    public class MyException : Exception
    {
        private readonly string _stackTrace;

        public MyException()
        {
            // skip the top two frames, which would be this constructor and whoever called us
            _stackTrace = new StackTrace(2).ToString();
        }

        public override string StackTrace
        {
            get { return _stackTrace; }
        }
    }
}
...