2017-05-22 16 views
7

Tôi có một ngoại lệ tùy chỉnh FilterAttribute như sau:Khi nào thì MVC ExceptionFilter sẽ được thực hiện so với trình xử lý lỗi cấp ứng dụng?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] 
public sealed class ExceptionLoggingFilterAttribute : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException(nameof(filterContext)); 
     } 

     if (filterContext.ExceptionHandled) 
     { 
      return; 
     } 

     // some exception logging code (not shown) 

     filterContext.ExceptionHandled = true; 
} 

Tôi đã đăng ký này trên toàn cầu trong FilterConfig.cs tôi

public static class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters?.Add(new ExceptionLoggingFilterAttribute()); 
    } 
} 

Tôi cũng có một phương pháp Application_Error khai báo trong global.asax tôi. cs

protected void Application_Error(object sender, EventArgs e) 
    { 
     var exception = Server.GetLastError(); 

     // some exception logging code (not shown) 
    } 
  1. khi mã lọc ngoại lệ sẽ bị ảnh hưởng và khi wil l nó đi thẳng đến trình xử lý lỗi toàn cục trong phương thức Application_Error? (Tôi hiểu khái niệm ExceptionHandled và nhận ra rằng bằng cách đánh dấu điều đó như được xử lý trong bộ lọc của tôi, nó sẽ không xếp tầng tới trình xử lý lỗi toàn cục).

Một ngoại lệ mà tôi cho rằng sẽ nhấn bộ lọc - một HttpException cho 404, không nhấn vào bộ lọc nhưng không bị bắt gặp trong trình xử lý lỗi ứng dụng.

  1. Tôi đã thấy một số mẫu mã nơi mọi người sử dụng HttpContext.Current trong global.asax.cs để thực hiện một Server.TransferRequest đến một dạng xem lỗi cụ thể. Đây có phải là phương pháp hay nhất không? Sẽ tốt hơn nếu sử dụng phần CustomErrors trong phần system.web của web.config?

Trả lời

0

Bộ lọc ngoại lệ sẽ chỉ được truy cập cho các lỗi xảy ra trong quá trình thực hiện đường dẫn ASP.NET MVC, ví dụ: trong khi thực hiện phương thức Hành động:

Bộ lọc ngoại lệ. Những thực hiện này IExceptionFilter và thực hiện nếu có một ngoại lệ unhandled ném trong khi thực hiện các ASP.NET MVC đường ống dẫn. Bộ lọc ngoại lệ có thể được sử dụng cho các tác vụ như ghi nhật ký hoặc hiển thị trang lỗi. Lớp HandleErrorAttribute là một ví dụ về bộ lọc ngoại lệ.

(từ: https://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx)

Trong trường hợp của một lỗi 404, một phương pháp hành động không thể được xác định, do đó lỗi là không được xử lý trong bộ lọc.

Tất cả các lỗi khác sẽ được xử lý theo phương pháp Application_Error.

Đối với phần thứ hai của câu hỏi của bạn, tôi khuyên bạn nên các bài viết trên blog sau đây có chứa một cái nhìn tổng quan tốt về làm thế nào để thiết lập các trang lỗi tùy chỉnh một cách đáng tin cậy: http://benfoster.io/blog/aspnet-mvc-custom-error-pages

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