5

ASP.NET MVC Web アプリがあり、そのエラー処理機能を改善しようとしています。私は HandleErrorAttribute 基本クラスを読み、それをコントローラー クラスで使用したいと考えました。ただし、その属性で装飾されたコントローラー クラスの 1 つのメソッドからテスト例外をスローすると、派生クラスのOnExceptionオーバーライドはトリガーされません。派生エラー処理クラスの OnException メソッドがトリガーされる代わりに、XML 形式の一般的なエラー メッセージが表示され、一般的なエラー メッセージがアプリのどこにも見つかりません

<Error>
    <Message>An error has occurred.</Message>
</Error>

私は何を間違っていますか?

このSO投稿で示されているように、次のカスタムエラー要素をweb.configファイルのsystem.web要素に追加しようとしましたが、役に立ちませんでした:

ASP.net MVC [HandleError]例外をキャッチしない

<customErrors mode="On" defaultRedirect="Error" />

これが私のHandleErrorAttribute派生クラスです:

public class HandleControllerErrors : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        // Breakpoint set here never hit.

        Exception ex = filterContext.Exception;
        filterContext.ExceptionHandled = true;
        var model = new HandleErrorInfo(filterContext.Exception, "Controller", "Action");

        filterContext.Result = new ViewResult()
        {
            // Use the ErrorInController view.
            ViewName = "ErrorInController",
            ViewData = new ViewDataDictionary(model)
        };
    }
} 

コントローラー クラスを装飾する方法を次に示します。try/catchブロック内にない例外を強制的にスローするメソッドがあります。

[HandleControllerErrors]
public class ValuesController : ApiController
{
    [Route("Api/TestException/")]
    public IHttpActionResult TestException()
    {
        throw new InvalidCastException("Fake invalid cast exception.");
    }
}
4

2 に答える 2