2012-05-11 11 views
5

Ich habe den folgenden Code:Wie wird der Methodenfluss mit dem OnException-Aspekt (PostSharp) fortgesetzt?

[Serializable] 
    class ExceptionAspectHandler:OnExceptionAspect 
    { 
     public override void OnException(MethodExecutionArgs args) 
     { 
      Console.WriteLine("{0}", args.Exception); 
      args.FlowBehavior = FlowBehavior.Continue; 
     } 
    } 

    [OnExceptionAspect] 
    public static void divide() 
      { 
       int n = Convert.ToInt32(Console.ReadLine()); 
       var a = 100/n; //the exception happens here 
       Console.WriteLine("it should get here"); 
      } 

Verwendung FlowBehavior.Continue endet divide() und kehrt zu der main() Methode.

+0

Ähm, Ihre Methode ist mit '[OnExceptionAspect]' dekoriert, so dass es das Standard-Verhalten von PostSharp 'OnExceptionAspect' ausführt, das nichts ist. Sie müssen es mit '[ExceptionAspectHandler]' dekorieren, damit Ihr Code funktioniert – Shevek

Antwort

4

Denken Sie daran, dass der OnException-Aspekt Ihren Code in einen try/catch-Code einbindet, sodass der Code vom Catch aus fortfährt (statt erneut zu schreiben) und sein Verhalten standardmäßig zurückgibt. Willst du, dass es dort weitergeht, wo es die Ausnahme war? Wenn dies der Fall ist, müssen Sie diese Zeile explizit in einen try/catch umbrechen.

Bitte lesen Sie http://www.sharpcrafters.com/blog/post/Day-6-Your-code-after-PostSharp.aspx für weitere Details.

+1

In diesem Blogpost sieht es so aus, als ob die Ausnahme automatisch neu ausgelöst wird. Wenn Sie FlowBeheavor auf Fortsetzen setzen, wird die Ausnahme nicht erneut ausgelöst. Ich denke, das ist das Gegenteil von dem, was in dieser Antwort gesagt wird. – Chris

+0

@Chris du bist richtig. Tippfehler meinerseits. –

0

Das in der Methode divide() verwendete Attribut sollte ExceptionAspectHandler sein (Sie haben erstellt), nicht OnExceptionAspect.