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.");
}
}