10

このクラスから継承する特定のタイプのコントローラー(これらはJSON結果を返すAPIコントローラー)の一般的なエラー処理を提供するために、Controller.OnExceptionハンドラーメソッドをオーバーライドする基本コントローラークラスがあります。コントローラによって例外が発生したときに、OnExceptionメソッドが呼び出されることはありません。誰かが私が間違っていることを知っていますか、またはこの状況を処理するためのより良い方法がありますか?

MVC1.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();
        }
}
4

6 に答える 6

12

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

filterContext.ExceptionHandled = true;
于 2009-06-06T20:32:41.257 に答える
2

ASP.NET MVC 3 プロジェクトでもまったく同じ問題が発生していました。

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

これを防ぐ方法の 1 つは、コンパイル モードを次のように変更することですWeb.config

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

これに:

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

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

于 2012-11-28T12:26:44.293 に答える
2

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

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

1 つの Index アクションを持つ新しいコントローラーを作成しました。OnException メソッドは実際に実行されます。また、SystemException() をスローしてみましたが、OnException メソッドも同様に起動されました。

    public ActionResult Index ( )
    {
        throw new NotImplementedException ( );
    }
于 2009-06-16T20:37:53.703 に答える
1

単体テストから、または ASP.NET 経由でコントローラー アクションを呼び出していますか? テストでメソッドを直接呼び出している場合 (NUnit など)、OnException は起動しません。テスト フレームワークが例外を処理し、それを失敗したテストに変換します。

于 2009-10-01T15:40:59.607 に答える
-1

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

于 2009-06-06T20:15:09.747 に答える