簡體   English   中英

ASP.NET MVC Controller.OnException未被調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM