2009-11-18 1 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. StackFrame 생성자에 skipFrames 매개 변수의 사용이라는 사실. 이것은 필수는 아니지만 일을 더 쉽게 만듭니다.

아래 예제는 스택 추적을 사용자 지정하는 방법을 보여줍니다. 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

2

호출 스택에서 "OnException"을 숨길 방법이 없습니다. 탠덤에서 작업

+0

예상 답변은 아니지만 가장 정확합니다. 감사. – remio