2012-11-02 34 views
5

Tôi muốn tạo ra một thuộc tính HandleError rằng tôi sẽ đưa vào một lớp học như thế này:thuộc tính đó sẽ quấn tất cả các phương pháp trong lớp học với try {} catch

[HandleError] 
public class Foo 
{ 
    public void Do(){} 
... 
    public void Don(){} 
} 

và nó sẽ quấn tất cả các phương pháp trong thử nắm bắt, vì vậy tôi tin rằng nó nên được một cái gì đó như thế này:

public class HandleErrorAttribute : Attribute 
{ 
    public void Execute() 
    {  
     try 
     { 
      method.Execute(); 
     } 
     catch(Exception ex) 
     { 
      //log 
     } 
    } 
} 

có thể như vậy?

+1

Với khuôn khổ hiện tại, không có. Nó có thể là có thể với một trong các thư viện AOP mặc dù. http://www.sharpcrafters.com/aop.net – asawyer

+0

Đó không phải là những gì thuộc tính làm. Như @asawyer lưu ý, postsharp có thể cho phép điều này; và trong các phiên bản tương lai, loại điều này có thể là một phần mở rộng nhờ vào trình biên dịch viết lại (aka Roslyn); nhưng tại thời điểm này: không có –

+0

@MarcGravell, bạn có nghĩ rằng điều này sẽ được xây dựng bởi vì Roslyn hay bạn nghĩ chúng tôi sẽ phải xây dựng một dự án nguồn mở cho nó? –

Trả lời

3

Bạn đang tìm kiếm một cái gì đó như PostSharp, và nó cũng có giá trị thực hiện. Tuy nhiên, việc thực hiện vượt quá phạm vi của câu hỏi này. Hãy xem điều này link, bạn sẽ thấy nó chỉ làm những gì bạn muốn.

Vì vậy, hãy tải xuống PostSharp, bắt đầu với nó và nếu bạn có thêm câu hỏi về nó thì chúng tôi có thể giúp bạn. Tuy nhiên, tài liệu của họ là cực kỳ tốt và nó là bánh để thực hiện.

[Serializable] 
public class MyExceptionHandling : OnMethodBoundaryAspect 
{ 
    public override void OnException(MethodExecutionArgs args) 
    { 
     // here you would perform the logging 
    } 
} 

Sau đó, trên phương pháp của bạn, bạn sẽ đánh dấu nó lên với các thuộc tính mới:

public class Foo 
{ 
    [MyExceptionHandling] 
    public void Do(){} 
    [MyExceptionHandling] 
    public void Don(){} 
} 
+0

vậy thuộc tính này sẽ được viết bằng cách sử dụng postsharp như thế nào? – Omu

+0

@ChuckNorris, bằng cách thực hiện phương thức 'OnException', nó được gói trong một khối' try-catch' của PostSharp để PostSharp có thể cho phép bạn xử lý nó. –

+0

ok, do đó, nếu không làm ném bên trong OnException, ngoại lệ sẽ không đi xa hơn – Omu

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