[英]Does Controller.OnException get called before ExceptionFilter?
[英]ASP.NET MVC Controller.OnException not being called
我有一個基本控制器類,我將覆蓋Controller.OnException處理程序方法,以便為將繼承此類的某些類型的控制器提供一般錯誤處理(這些控制器將返回JSON結果)。 當控制器引發異常時,永遠不會調用OnException方法。 有誰看到我做錯了什么,或者有更好的方法來處理這種情況?
使用MVC 1.0
基類:
public class APIController : Controller
{
protected override void OnException(ExceptionContext filterContext)
{
//This is never called
filterContext.Result =
new JsonResult();
base.OnException(filterContext);
}
}
繼承類:
public class MyController : APIController
{
public AjaxResult ForcedException()
{
throw new SystemException();
}
}
如果我正確理解您的問題 - 您的異常必須在OnException中標記為“已處理”。 試試這個:
filterContext.ExceptionHandled = true;
MSDN文檔( http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onexception.aspx )聲明OnException方法“在操作中發生未處理的異常時被調用”。
所以,聽起來它可能只會在動作方法中發生未處理的異常時觸發。
我創建了一個帶有一個Index操作的新控制器。 並且OnException方法實際上確實執行。 我也試過拋出一個SystemException()和OnException方法。
public ActionResult Index ( )
{
throw new NotImplementedException ( );
}
我在ASP.NET MVC 3項目中遇到了完全相同的問題。
事實證明,這是Visual Studio和開發服務器的一個功能。 在調試模式下,您將返回到Visual Studio並給出默認的異常對話框。
阻止這種情況發生的一種方法是更改Web.config
的編譯模式:
<compilation debug="true" targetFramework="4.0">
對此:
<compilation debug="false" targetFramework="4.0">
您也可以將調試模式設置為true,但可以通過從visual studio菜單中選擇Start without debugging option
來測試您的應用程序(通過按Ctrl+F5
調用)。
您是通過單元測試還是通過ASP.NET調用控制器操作? 如果您在測試中直接調用該方法,比如通過NUnit調用,那么OnException將不會觸發:測試框架將處理異常並將其轉換為失敗的測試。
對於HandleErrorAttribute
,相同的規則適用於Controller.OnException
HandleErrorAttribute
所需的配置在HandleErrorAttribute
注明https://stackoverflow.com/a/528550/939634
如果你的web.config
customError
設置為mode="RemoteOnly"
而你正在本地調試,或者你有mode="Off"
,則不會處理異常,你會看到帶有堆棧跟蹤的ASP.Net黃色屏幕。
如果設置mode="On"
或者您正在遠程查看站點並且具有mode="RemoteOnly"
OnException
方法將正確執行。
將[HandleError]
屬性應用於類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.