2016-01-21 97 views

回答

0

http://www.codeguru.com/csharp/.net/net_asp/mvc/handling-errors-in-asp.net-mvc-applications.htm

註冊這表明全球的錯誤處理方式不同。通常設置全局異常處理過濾器。

GlobalFilters.Filters.Add(new SpecialHandleErrorAttributeCreatedByYou()); 

您將從HandleErrorAttribute派生一個新的屬性,並將您的邏輯放在那裏,覆蓋OnException方法。

public override void OnException(ExceptionContext filterContext) 

但是,這不會顯示由其他代碼處理的異常。這是關鍵,他們被處理,所以他們不會繼續泡沫堆棧。你將不得不把代碼放在每個catch塊中去做你想做的事情。

+0

這意味着沒有機會追蹤所有由用戶代碼處理的異常? –

+0

在非常先進的東西之外沒有任何機會,比如插入AppDomain並在用戶代碼處理它之前處理異常,就像VS調試器能夠做到的那樣。你也許可以用Fody IL Weaving做類似的事情(無論你在哪裏看到一個catch塊都可以編織)。 https://github.com/Fody/Fody – Cleverguy25

1

全球錯誤處理:

public class MvcApplication : System.Web.HttpApplication 
{ 
     protected void Application_Error(object sender, EventArgs e) 
     { 
      Exception exception = Server.GetLastError(); 
      Server.ClearError(); 
      Response.Redirect("/Home/Error"); 
     } 
} 

或覆蓋onException的方法:

public class HomeController : Controller 
{ 
    protected override void OnException(ExceptionContext filterContext) 
    { 
     Exception ex = filterContext.Exception; 
     filterContext.ExceptionHandled = true; 

     var model = new HandleErrorInfo(filterContext.Exception, "Controller","Action"); 

     filterContext.Result = new ViewResult() 
     { 
      ViewName = "Error", 
      ViewData = new ViewDataDictionary(model) 
     }; 
    } 
} 
+0

它可以處理那些由用戶代碼處理的異常嗎? –

+0

如果你處理了一個異常,你不會再次拋出它,它不能再處理它。處理的異常一次不能再進行處理。 –

0

是的,它是可能的,你可以重寫。 HandleErrorAttribute 和全球

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
{ 
filters.Add(YourNewHandler()); 
... 
} 
+0

它可以處理那些由用戶代碼處理的異常嗎? –