2012-01-03 23 views
20

Tôi đang xây dựng trang web thương mại điện tử MVC 3.0. Tôi muốn tránh gắn bó các khối try-catch trên toàn bộ mã của mình.Làm cách nào để bắt tất cả các lỗi được ném trong ứng dụng MVC 3.0?

Câu hỏi khá đơn giản - Chiến lược hay để nắm bắt tất cả các lỗi được đưa lên trang web của tôi là gì? Tôi muốn biết về tất cả chúng ... vì vậy tôi có thể làm việc để tăng số lượng đó lên 0 khi trang web hoạt động. Tôi dự định viết từng lỗi cho một trình ghi nhật ký và cũng có thể gửi email cho nó.

Tôi đã thực hiện một số đọc về chụp ảnh trong tệp global.asax ... nhưng tôi cũng đã đọc rằng nó không nhận được TẤT CẢ chúng.

Bất kỳ ai có bất kỳ đề xuất nào hoặc có thể chỉ cho tôi theo một hướng tốt?

+1

Tôi thích tất cả các câu trả lời ... tôi đã thử một câu hỏi về ELMAH và tôi yêu thích nó. Cài đặt nó dễ dàng như vậy và tôi sẽ thay thế nó hoàn toàn với logger crappy của tôi. Tôi muốn xem một số bình chọn/bình luận để chắc chắn rằng ELMAH là con đường để đi ... –

+0

Tôi đồng ý! ELMAH thật tuyệt vời và rất dễ cài đặt. Tôi đã sử dụng ELMAH trong số dự án thành công. – azamsharp

Trả lời

21

Cách MVC để giải quyết vấn đề đó là bộ lọc. Nếu bạn đang sử dụng MVC3, các bộ lọc toàn cục dành cho bạn. Có loại bộ lọc đặc biệt để xử lý lỗi: bộ lọc HandleError. This article mô tả phần lớn việc sử dụng nó.

Bạn có thể thực hiện bạn sở hữu bộ lọc và kiểm soát mọi khía cạnh của các ngoại lệ unhandled, ví dụ:

public class HandleExceptionsAttribute : HandleErrorAttribute 
{ 
    public override void OnException(ExceptionContext filterContext) 
    { 
     var expception = filterContext.Exception; 

     // custom code here.. 
    } 
} 

Cuối cùng, nếu bạn muốn có tất cả các trường hợp ngoại lệ unhandled được lưu trữ và đăng nhập, ELMAH tức ELMAH.MVC là sự lựa chọn tốt nhất. Cài đặt nó bằng cách sử dụng các NuGet package, cấu hình nó và tất cả các dữ liệu sẽ được truy cập từ một liên kết như:

http://yourapp/admin/elmah/

Đề nghị của tôi là để không sử dụng bất cứ điều gì như Application_Error trong Global.asax. cs.

+0

Tôi đã đi tuyến đường này. Tất cả mọi thứ đã được thiết lập khá nhiều cho tôi bằng cách sử dụng nuget, đó là tuyệt vời. Chỉ có cạm bẫy - mọi người cần đảm bảo họ bảo mật tập tin elmah.axd của họ. Ngay cả khi bạn cho phép attr trên bộ điều khiển elmah, bạn vẫn có thể đến elmah.axd. Nếu bạn chặn nó, hãy chắc chắn rằng bạn cũng không thể làm một cái gì đó như /a/b/c/d/elmah.axd ... vì vậy phải mất một ít công việc. –

+0

Đừng bận tâm với elmah.axd, vui lòng xóa nó khỏi web.config của bạn! Unfortunatelly Tôi không thể làm điều đó một cách tự động. Khi đã cài đặt Elmah.MVC, bạn sẽ đăng ký tuyến đường http: // app/admin/elmah. Không có vấn đề gì để bảo mật nó bằng thuộc tính [Authorize]; –

+0

một số chi tiết tại đây: http://www.beletsky.net/2011/03/integrating-elmah-to-aspnet-mvc-in.html –

2

Bạn có thể xử lý bất kỳ ngoại lệ nào được ném trong Global.asax.

protected void Application_Error(object sender, EventArgs e) 
{ 
    Exception exception = Server.GetLastError(); 
    // global handling code goes here 

    Server.ClearError(); 
} 
+0

Điều này có vẻ dễ bị các điều kiện chủng tộc. –

+3

Nó cũng không hoạt động – War

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