2012-05-11 26 views
5

Tôi có đoạn mã sau:Làm thế nào để tiếp tục luồng phương pháp sử dụng khía cạnh OnException (PostSharp)?

[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"); 
      } 

Sử dụng FlowBehavior.Continue kết thúc divide() và trở về phương thức main().

+0

Um, phương pháp của bạn được trang trí bằng '[OnExceptionAspect]' do đó nó sẽ thực hiện hành vi PostSharp 'OnExceptionAspect' mặc định không có gì. Bạn cần phải trang trí nó bằng '[ExceptionAspectHandler]' để mã của bạn hoạt động – Shevek

Trả lời

4

Hãy nhớ rằng, khía cạnh OnException bao bọc mã của bạn trong một lần thử/nắm bắt để mã sẽ tiếp tục từ đánh bắt (thay vì làm lại) và hành vi của nó sẽ mặc định trả về. Bạn có muốn nó tiếp tục từ nơi nó ném ngoại lệ? Nếu vậy, bạn cần phải rõ ràng quấn dòng đó trong một thử/bắt chính mình.

Vui lòng đọc http://www.sharpcrafters.com/blog/post/Day-6-Your-code-after-PostSharp.aspx để biết thêm chi tiết.

+1

Từ bài đăng trên blog này, có vẻ như ngoại lệ được tự động sửa lại. Nếu bạn thiết lập FlowBeheavor để tiếp tục, ngoại lệ không được rethrown. Tôi nghĩ điều đó ngược lại với những gì được nói trong câu trả lời này. – Chris

+0

@ Xin lỗi bạn là chính xác. Typo về phía tôi. –

0

Thuộc tính được sử dụng trong phương thức divide() phải là ExceptionAspectHandler (bạn đã tạo), không phải là OnExceptionAspect.

Các vấn đề liên quan