2009-06-06 54 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メソッドが呼び出されることはありません" - デバッガでこれをチェックしましたか?あなたの質問からは分かりません。 –

+0

私はデバッガから試して、ログステートメントを使用し、デバッガの外で実行しています。どちらも私のために働いていないようです。 –

答えて

-1

クラスに[HandleError]属性を適用します。

10

あなたの質問が正しく理解されていれば、例外はあなたのOnExceptionで "処理済み"とマークされている必要があります。これを試してみてください:

filterContext.ExceptionHandled = true; 
+0

これは私のために働いた – benpage

+11

私はむしろこれが質問への答えである方法に困惑しています... – nashwan

+0

マイナス1は全く質問に答えません。 – ken2k

2

MSDNのドキュメント(http://msdn.microsoft.com/en-us/library/system.web.mvc.controller.onexception.aspx)がonExceptionをメソッドが「未処理の例外がアクションで発生したときに呼び出される。」と述べています

したがって、アクションメソッドで未処理の例外が発生した場合にのみ起動するように思えます。

1つのインデックスアクションで新しいコントローラを作成しました。 OnExceptionメソッドは実際には実行されます。私はSystemException()とOnExceptionメソッドも投げてみました。

public ActionResult Index () 
    { 
     throw new NotImplementedException (); 
    } 
1

コントローラの動作をユニットテストまたはASP.NET経由で呼び出していますか?メソッドをNUnitなどのテストで直接呼び出す場合、OnExceptionは発生しません。テストフレームワークは例外を処理し、失敗したテストにします。

1

私はASP.NET MVC 3プロジェクトで全く同じ問題を抱えていました。

これはVisual Studioと開発サーバーの機能であることが判明しました。デバッグモードでは、Visual Studioに戻り、デフォルトの例外ダイアログボックスが表示されます。これに

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

:起きてからこれを停止する

一つの方法は、このことから、あなたのWeb.configでコンパイル・モードを変更することです

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

また、trueに設定し、デバッグモードを残すことができますが、ビジュアルスタジオメニュー(Ctrl+F5を押して呼び出す)からStart without debugging optionを選択して、アプリケーションが動作していることをテストします。

0

あなたがmode="RemoteOnly"にごweb.configセットにcustomErrorを持っていて、ローカルでデバッグしているか、あなたはmode="Off"持ちの場合HandleErrorAttributeに必要な設定は、ここでhttps://stackoverflow.com/a/528550/939634

を指摘しているHandleErrorAttribute

の場合と同じ規則がController.OnExceptionの申請例外は処理されず、ASP.Netの黄色の画面にスタックトレースが表示されます。

mode="On"を設定した場合、またはリモートでサイトを表示している場合に、mode="RemoteOnly"OnExceptionメソッドが正しく実行されます。

関連する問題