2

Exceptionがスローされた場合にカスタムエラーページで表示できるように設定しました。ただし、エラーページに移動したくない場合は、単純なダイアログウィンドウを表示したい場合があります。

public ActionResult Page1()
{
    //The custom error page shows the exception, if one was thrown

    throw new Exception( "An exception was thrown" );

    return View();
}


public ActionResult Page2()
{
    //A dialog should show the exception, if one was thrown

    try
    {
        throw new Exception( "An exception was thrown" );
    }
    catch( Exception ex )
    {
        ViewData["exception"] = ex;
    }
    return View();
}

Controllerアクションでスローされた例外を処理するCustomAttributeを持つことは可能ですか?Page2に追加した場合、例外がスローされるたびCatchExceptionに、例外をに格納するプロセスを自動化できますか?ViewData私はCustomAttributesの経験があまりないので、助けていただければ幸いです。

Page2の例は完全に正常に機能します。すべてのアクション(ダイアログを表示したい場合)でtry catchを使用するのはあまり美しくないため、コードをよりクリーンにしたいだけです。

.NETMVC4を使用しています。

4

2 に答える 2

3

例外をキャッチして処理する基本コントローラーを作成できます。また、コントローラーにはすでにそれを行うメカニズムがあるようです。コントローラー内で OnException メソッドをオーバーライドする必要があります。ここで良い例を得ることができます: ASP.NET MVC での例外の処理

また、ここで OnException を使用する方法に関する別の回答があります: OnException の使用

これを使用すると、多くの try/catch ブロックを実行する必要がないため、コードがよりクリーンになります。

処理したい例外をフィルタリングする必要があります。このような:

protected override void OnException(ExceptionContext contextFilter)
{
    // Here you test if the exception is what you are expecting
    if (contextFilter.Exception is YourExpectedException)
    {
        // Switch to an error view
        ...
    }
    //Also, if you want to handle the exception based on the action called, you can do this:
    string actionName = contextFilter.RouteData.Values["action"];
    //If you also want the controller name (not needed in this case, but adding for knowledge)
    string controllerName = contextFilter.RouteData.Values["controller"];
    string[] actionsToHandle = {"ActionA", "ActionB", "ActionC" };

    if (actionsTohandle.Contains(actionName)) 
    {
         //Do your handling.
    }

    //Otherwise, let the base OnException method handle it.
    base.OnException(contextFilter);
}
于 2012-10-29T18:47:38.540 に答える
0

Exception クラスのサブクラスを作成し、ページ 2 でキャッチできます。

internal class DialogException : Exception
{}

public ActionResult Page2()
{
    //This should a dialog if an exception was thrown

    try
    {
        //throw new Exception( "An exception was thrown, redirect" );
        throw new DialogException( "An exception was thrown, show dialog" );
    }
    catch( DialogException ex )
    {
        ViewData["exception"] = ex;
    }
    return View();
}
于 2012-10-29T18:44:04.937 に答える