Trong một ứng dụng MVC3 web tôi đã sử dụngMVC [HandleError] HandleErrorAttribute gọi hai lần khi sử dụng khai thác gỗ toàn cầu
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
để áp dụng xử lý lỗi toàn cầu nơi người dùng được hiển thị 'Lỗi' xem nếu một ngoại lệ unhandled xảy ra.
Đối với một Chế độ xem cụ thể, tôi cũng muốn có một chế độ xem lỗi khác được hiển thị nếu ngoại lệ chưa được xử lý xảy ra bằng cách trang trí phương thức với [HandleError(View = "SpecialError")]
. Điều này làm việc tốt.
Sau đó tôi muốn thêm nhật ký toàn cầu ngoại lệ chưa được xử lý. Tôi đã tạo thuộc tính HandleError tùy chỉnh có mã đăng nhập:
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Write to log code
base.OnException(context);
}
}
Và cập nhật RegisterGlobalPhương pháp trang trí và phương pháp để sử dụng tên thuộc tính này thay thế. Điều này hoạt động nói chung nhưng khi một ngoại lệ xảy ra trong phương thức được trang trí bằng MyHandleError(View = "SpecialError")]
, phương pháp OnException được gọi là hai lần. Ban đầu tôi cho rằng việc trang trí phương thức với thuộc tính này thay thế cho trình xử lý toàn cục, nhưng có vẻ như nó được thêm vào (điều này có ý nghĩa hơn, nhưng nó không phải là thứ tôi muốn). Bằng cách gọi OnException hai lần, cùng một ngoại lệ được ghi hai lần mà không phải xảy ra. Tôi không nghĩ rằng OnException đang được gọi hai lần bởi vì nó là thuộc tính tùy chỉnh - tôi tin rằng điều này xảy ra với thuộc tính HandleError chuẩn cũng có thể hiển thị khi tôi đang tạo bản ghi của nó.
Cuối cùng, tôi muốn ghi lại tất cả các ngoại lệ chưa được xử lý (một lần), trong khi giữ lại các tính năng được cung cấp bởi [HandleError], đặc biệt là thiết lập các khung nhìn khác nhau cho các ngoại lệ của phương thức cụ thể. Có cách nào để làm việc này không?
Cảm ơn! cái này cũng có tác dụng với tôi. – abjbhat
Xin chào, giải pháp tuyệt vời, nhưng làm cách nào bạn có thể nhận thêm thông tin từ nguồn ngoại lệ như tên lớp/phương thức? – Patrick