2011-07-06 33 views
19

Tôi muốn xử lý các trường hợp ngoại lệ chưa được thực hiện trong ứng dụng ASP.NET MVC 3 của mình, để tôi có thể truyền đạt lỗi cho người dùng thông qua giao diện lỗi của ứng dụng. Làm thế nào để tôi chặn các trường hợp ngoại lệ không bị bắt? Tôi muốn để có thể làm điều này trên toàn cầu, không phải cho mỗi bộ điều khiển (mặc dù tôi sẽ không nhớ làm thế nào để làm điều này là tốt).Làm thế nào để xử lý các ngoại lệ không bị bắt trong một ứng dụng ASP.NET MVC 3?

Trả lời

19

Bạn có thể thiết lập một bộ lọc lỗi toàn cầu trong Global.asax

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
    filters.Add(new HandleErrorAttribute()); 
} 

Các bộ trên lên một lỗi xử lý mặc định mà chỉ đạo tất cả các ngoại lệ đối với các sai số chuẩn View. Chế độ xem lỗi được nhập vào đối tượng mô hình System.Web.Mvc.HandleErrorInfo hiển thị chi tiết ngoại lệ.

Bạn cũng cần bật các lỗi tùy chỉnh trong web.config để xem điều này trên máy cục bộ của mình.

<customErrors mode="On"/> 

Bạn cũng có thể xác định nhiều bộ lọc với nhiều loại lỗi cụ thể:

filters.Add(new HandleErrorAttribute 
{ 
    ExceptionType = typeof(SqlException), 
    View = "DatabaseError", 
    Order = 1 
}); 

/* ...other error type handlers here */ 

filters.Add(new HandleErrorAttribute()); // default handler 

Lưu ý rằng HandleErrorAttribute sẽ chỉ xử lý các lỗi xảy ra bên trong các đường ống dẫn MVC (ví dụ: 500 lỗi).

+0

Cảm ơn bạn, điều này làm việc rất tốt :) – aknuds1

10

bạn có thể sử dụng bộ lọc HandleErrorAttribute,

[ErrorHandler(ExceptionType = typeof(Exception), View = "UnhandledError", Order = 1)] 
public abstract class BaseController : Controller 

     { 
    } 

về cơ bản bạn có thể có điều này trên đầu trang của một bộ điều khiển cơ sở và xác định các UnhandledError.cshtml trong Shared xem thư mục.

Và nếu bạn muốn ghi lại các lỗi chưa được xử lý trước khi bạn hiển thị thông báo lỗi thì bạn có thể mở rộng lớp HandleErrorAttribute và đặt logic để ghi nhật ký bên trong phương thức OnException.

public class MyErrorHandlerAttribute : HandleErrorAttribute 
    { 


     public override void OnException(ExceptionContext exceptionContext) 
     { 
      Logger.Error(exceptionContext.Exception.Message,exceptionContext.Exception); 
      base.OnException(exceptionContext); 
     } 
    } 
4

Vì mục đích đầy đủ, cũng có trình xử lý Application_Error trong Global.asax.

2

để làm cho công việc này, tôi theo sau blog post và sau đó thực hiện việc bổ sung sau đây để cả hai tập tin Web.config (một trong những gốc và một trong các thư mục Views) bên trong <system.web> nút:

... 
    <system.web> 
    <customErrors mode="On"/> 
    ... 

Hy vọng nó sẽ giúp ...

3

Lỗi toàn cầu Xử lý

  1. Thêm vào web.config

    <customErrors mode="On"/>
  2. Lỗi sẽ được hiển thị trên Error.cshtml đó là cư trú trong chia sẻ thư mục

  3. Thay đổi trong Error.cshtml
 
    @model System.Web.Mvc.HandleErrorInfo 

    @{ 
     ViewBag.Title = "Error"; } 


    <h2> 
     <p>Sorry, an error occurred while processing your request.</p> 
     <p>Controller Name: @Model.ControllerName</p> 
     <p>Action Name : @Model.ActionName</p> 
     <p>Message: @Model.Exception.Message</p> </h2> 

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