2012-03-13 17 views
10

Tôi thấy mình viết các phương thức với try {stuff} catch (Exception e) {log, các thứ khác} bỏ một chút, vì vậy tôi đã cố gắng tìm ra cách để tạo một thuộc tính để trợ giúp tôi ra ngoài. Tôi đã kiểm tra các chủ đề sau khá rộng rãi và dường như không thể triển khai thực hiện của tôi.C# thuộc tính để bao quanh với try - catch

attribute does not seem to act at all

ASP.NET MVC Controller.OnException not being called

.net Attributes that handle exceptions - usage on a property accessor

My top-level web.config được thiết lập để

<customErrors mode="On" defaultRedirect="/error.html"/> 

và tôi đang soạn thảo trong chế độ không-debug. Thuộc tính của tôi là dưới đây:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
public class SafeWebMethodAttribute: ActionFilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     filterContext.ThrowIfNull(); 

     if (filterContext.ExceptionHandled) 
     { 
      return; 
     } 
     Log.LogException(filterContext.Exception); 
     filterContext.HttpContext.Response.StatusCode = 500; 
     filterContext.HttpContext.Response.Write(filterContext.Exception); 
     filterContext.ExceptionHandled = true; 
    } 
} 

và tôi gọi đó là ở đây -

public class Test : Controller 
{ 
    [SafeWebMethod] 
    public ActionResult Test() 
    { 
     throw new ArgumentException("test"); 
    } 
} 

tôi dường như không thể có được một breakpoint nhấn trong các thuộc tính, hoặc nếu tôi thay đổi mã trạng thái để hiển thị mã trạng thái.

Tôi cũng đã sao chép mã từ thuộc tính [HandleError] và cũng không thể có điểm ngắt trong đó, vì vậy tôi cho rằng cấu hình của tôi sai, nhưng tôi không thể hiểu được điều gì.

Bất kỳ suy nghĩ hay ý tưởng sẽ được đánh giá rất

Trả lời

1

Đi từ liên kết mà bạn cung cấp .net Attributes that handle exceptions - usage on a property accessor những gì bạn muốn là không thể (xem thực hiện trong Aaronaught đoạn mã thứ hai).

Trừ khi bạn sử dụng một số loại khung công tác, bạn sẽ phải triển khai mã kiểm tra thuộc tính và tự mình thực hiện mã đó và chạy mã đó trong mỗi câu lệnh catch(...).

Ý tưởng bạn có là tuyệt vời và tôi có thể sử dụng nó trong khung của riêng mình, nhưng ràng buộc vẫn giữ rằng bạn phải tự mình thực hiện nó.

hth

Mario

+0

hm, theo MSDN, http://msdn.microsoft.com/en-us/library/system.web.mvc.handleerrorattribute.aspx, HandleError "Đại diện cho một thuộc tính được sử dụng để xử lý một ngoại lệ được ném bởi một phương thức hành động. ", và tôi đã không thực sự thấy bất kỳ điều gì nghiêm ngặt về các trình truy cập thuộc tính. Điều đó đang được nói, có phải vì "phương pháp" của tôi không phải là một phương pháp hành động? – hermitt

+0

Im không vào lập trình web asp nhưng tôi giả định rằng phương pháp hành động đảo ngược mã đằng sau các phương pháp được gọi bởi bộ điều khiển mvc. Tôi tiếp tục giả định rằng bộ điều khiển mvc bắt ngoại lệ và đánh giá các thuộc tính nếu phương thức và sau đó xử lý tương ứng. Đây là mẫu mà bạn cũng có thể sử dụng - trong catch (..) của người gọi viết một hàm kiểm tra các thuộc tính và hành vi tương ứng. hth Mario –

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