當在一個MVC3 web應用我用使用全局日誌
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
應用全局錯誤處理,其中用戶被示出的「錯誤」視圖如果未處理的異常出現調用兩次MVC [的HandleError] HandleErrorAttribute。
對於一個特定的視圖,我還希望通過裝飾方法[HandleError(View = "SpecialError")]
發生未處理的異常時顯示不同的錯誤視圖。這工作得很好。
我然後想要添加全局日誌記錄未處理的異常。我創建了日誌代碼自定義的HandleError屬性:
public class MyHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Write to log code
base.OnException(context);
}
}
和更新的RegisterGlobalFilters和方法裝飾使用這個屬性名代替。這一般起作用,但是當用MyHandleError(View = "SpecialError")]
裝飾的方法內出現異常時,OnException方法被稱爲兩次。我原先假設用這個屬性裝飾方法取代了全局處理器,但它似乎只是被添加到(這更有意義,但它不是我想要的)。通過兩次調用OnException,同樣的異常會被記錄兩次,這是不會發生的。我不認爲OnException被稱爲兩次,因爲它是一個自定義屬性 - 我相信這也發生在標準的HandleError屬性,它現在簡單地可見,因爲我正在創建它的記錄。最終,我想記錄所有未處理的異常(一次),同時保留[HandleError]提供的功能,特別是爲特定的方法異常設置不同的視圖。有沒有一種乾淨的方式來做到這一點?
謝謝!這對我也很有用。 – abjbhat 2013-08-01 06:40:53
嗨,很好的解決方案,但你怎麼能從異常的來源,如類/方法的名稱獲得更多的信息? – Patrick 2014-04-17 11:01:38