2009-11-18 5 views
0

Je voudrais ajouter automagiquement le code suivant autour du corps de certaines méthodes:Comment convertir une exception en une autre en utilisant PostSharp?

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

Je travaille avec PostSharp 1.0 et voici ce que je l'ai fait au moment:

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

Mon problème est que je peux voir l'appel PostSharp OnException dans la pile.
Quelle serait la bonne pratique pour éviter cela et obtenir la même pile d'appels que l'implémentation manuelle du gestionnaire d'exceptions?

Répondre

1

Deux choses qui travaillent en tandem vous permettra de le faire:

  1. Le fait que Exception.StackTrace est virtual
  2. L'utilisation du paramètre skipFrames au constructeur StackFrame. Cela n'est pas obligatoire mais facilite les choses

L'exemple ci-dessous montre comment personnaliser la trace de la pile. Notez que je ne connais aucun moyen de personnaliser la propriété Exception.TargetSite, qui donne toujours les détails de la méthode à l'origine de l'exception.

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

Ce n'est pas 100% propre (TargetSite), mais j'aime le hack. Merci. – remio

2

Il n'existe aucun moyen de masquer "OnException" à partir de la pile d'appels.

+0

Ce n'était pas une réponse attendue, mais c'est la réponse la plus précise! Merci. – remio

Questions connexes