2009-11-18 53 views
0

我想自動的周圍添加一些方法的身體下面的代碼:如何使用PostSharp將異常轉換爲另一個異常?

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調用。
避免這種情況並獲得與手動執行異常處理程序相同的調用堆棧的良好做法是什麼?

回答

1

兩件事情協同工作,可以讓你做到這一點:

  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; } 
     } 
    } 
} 
+0

這不是100%乾淨(TargetSite),但我喜歡黑客。謝謝。 – remio 2009-11-24 17:54:41

2

無法隱藏調用堆棧中的「OnException」。

+0

這不是預期的答案,但它是最敏感的答案!謝謝。 – remio 2009-11-24 17:53:36