2009-06-06 81 views
9

我有一個基礎控制器類,我在其中重寫Controller.OnException處理程序方法,以便爲將繼承此類的某些類型的控制器提供通用錯誤處理(這些是將返回JSON結果的API控制器)。當控制器引發異常時,OnException方法永遠不會被調用。有沒有人看到我做錯了什麼,還是有更好的方法來處理這種情況?ASP.NET MVC Controller.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(); 
     } 
} 
+0

「當控制器引發異常時,OnException方法永遠不會被調用」 - 您是否使用調試器檢查了這一點?你的問題並不清楚。 – 2009-06-06 20:40:06

+0

我試過它從調試器,並通過使用日誌語句並在調試器外運行它。他們都沒有爲我工作。 – 2009-06-07 14:48:17

回答

-1

應用[HandleError]屬性的類。

10

如果我正確理解你的問題 - 你的異常必須在OnException中標記爲「已處理」。試試這個:

filterContext.ExceptionHandled = true; 
2

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 (); 
    } 
1

您是從單元測試還是通過ASP.NET調用控制器操作?如果你直接在測試中調用方法,比如說通過NUnit,那麼OnException將不會觸發:測試框架將處理異常並將其變爲失敗的測試。

1

我在ASP.NET MVC 3項目中遇到了完全相同的問題。原來,這是Visual Studio和開發服務器的一個特性。在調試模式下,您將返回到Visual Studio並給出默認的異常對話框。要阻止這種情況發生

一種方法是從這個在您的Web.config改變編譯模式:

<compilation debug="true" targetFramework="4.0"> 

要這樣:

<compilation debug="false" targetFramework="4.0"> 

您也可以走人調試模式設置爲true,但通過從視覺工作室菜單中選擇Start without debugging option來測試您的應用程序是否工作(按Ctrl+F5調用。

0

同樣的規則也適用於Controller.OnExceptionHandleErrorAttribute

HandleErrorAttribute所要求的配置在這裏要注意https://stackoverflow.com/a/528550/939634

如果您在web.config設置爲mode="RemoteOnly"customError,你是在本地調試或者您有mode="Off"的異常將不會被處理,您將看到帶有堆棧跟蹤的ASP.Net黃色屏幕。

如果您設置了mode="On"或者您正在遠程查看該站點並且有mode="RemoteOnly"您的OnException方法將正確執行。