0

いくつかのメソッドの本体の周りに次のコードを自動的に追加したいと思います。

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

私はPostSharp1.0を使用していますが、これは現在私が行っていることです。

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

私の問題はOnException、スタックにPostSharp呼び出しが表示されることです。
これを回避し、例外ハンドラーを手動で実装するのと同じ呼び出しスタックを取得するための良い方法は何でしょうか?

4

2 に答える 2

2

呼び出しスタックから「OnException」を隠す方法はありません。

于 2009-11-18T11:05:52.750 に答える
1

連携して動作する2つのことにより、これを行うことができます。

  1. それException.StackTracevirtual
  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; }
        }
    }
}
于 2009-11-18T19:59:45.397 に答える