web-dev-qa-db-ja.com

asp.net mvc 3でのエラー処理

Asp.net mvc 3のエラーを処理するための組み込みまたは適切な方法はありますか?

これは私がしたいことです:

  1. アプリケーションがクラッシュするか、エラーをスローすると、特定のエラーページに移動します。
  2. コントローラーアクションから自分のエラーをスローできます。 (そしてそれはエラーページに行きます)。

私は次の方法を見つけました:

  1. それを行うには長い道のりがあると思います here 。 (v1およびv2の場合、v3にも適用されます)。
  2. Errorhandle属性 here を使用します。

これを適切に処理するにはどうすればよいですか?

ソリューションが類似しているか、上記のリストの#1のようである場合、私はninjectを使用しており、基本クラスを作成していません。これをどうやってやるの?

34
Shawn Mclean

グローバルエラー処理の場合
web.configページのcustomErrors mode = "On"を変更するだけです
ErrorはError.cshtmlが共有フォルダにあることで表示されます。

Error.cshtmlレイアウトがnullでないことを確認してください
[次のようになります:@ {Layout = "〜/ Views/Shared/_Layout.cshtml"; }
またはLayout = nullコードブロックを削除]
Error.cshtmlのサンプルマークアップ:-

@{ Layout = "~/Views/Shared/_Layout.cshtml"; } 

@model System.Web.Mvc.HandleErrorInfo

<!DOCTYPE html>
<html>
<head>
    <title>Error</title>
</head>
<body>
    <h2>
        Sorry, an error occurred while processing your request.
    </h2>
    <p>Controller Name: @Model.ControllerName</p>
    <p>Action Name : @Model.ActionName</p>
    <p>Message: @Model.Exception.Message</p>
</body>
</html>

特定のエラー処理について
コントローラクラスの特定のアクションにHandleError属性を追加します。その特定のエラーに「View」と「ExceptionType」を提供します。
サンプルのNotImplemented Exception Handler:

public class MyController: Controller
    {
        [HandleError(View = "NotImplErrorView", ExceptionType=typeof(NotImplementedException))]
        public ActionResult Index()
        {
            throw new NotImplementedException("This method is not implemented.");
            return View();
        }
}
14
Sunil

カスタムHandleErrorAttributeアクションフィルターを実装することをお勧めします。

詳細については、このリンクを参照してください。
http://msdn.Microsoft.com/en-us/library/dd410203%28v=vs.90%29.aspx

HandleErrorAttributeアクションフィルターを設定すると、フィルターによって処理されるアクションを完全に制御できます。また、カスタムベースコントローラーで設定し、すべてのコントローラは基本コントローラから継承します。

私がこれで行う別のことは、カスタムページではなく、Json応答を返すことによってAjax呼び出しに応答する個別のHandleJsonErrorAttributeがあることです。

UPDATE:

以下のいくつかの質問に従って、ここで私が使用するHandleJsonErrorAttributeの例を示します。

public class HandleJsonErrorAttribute : HandleErrorAttribute
{
    public override void OnException(ExceptionContext filterContext)
    {
        var serviceException = filterContext.Exception as ServiceException;

        filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;

        filterContext.Result = new JsonResult { Data = new { message = serviceException == null ? "There was a problem with that request." : serviceException.Message } };

        filterContext.ExceptionHandled = true;
    }
}

そして、これらの手に負わない例外を処理するために使用するjQueryは次のとおりです。

$(document).ajaxError(function (event, jqXHR, ajaxSettings, thrownError) {
    showPopdown($.parseJSON(jqXHR.responseText).message);
});

これにより、私のAjaxメソッドを非常に軽量にすることができます。これらのメソッドは通常のJsonの戻りを処理するだけであり、ハンドリングされない例外が発生した場合、エラーステータスコードを含むメッセージがJsonにラップされて返されます。

また、私の実装では、サービスからスローするカスタムServiceExceptionがあり、これにより、汎用メッセージの代わりにサービスレイヤーからメッセージが送信されます。

15
Jerad Rose

あなたがそれを行うことができると思う最も簡単な方法は、elmahライブラリを使用することです。

これを見てください: http://code.google.com/p/elmah/wiki/MVC そしてこれ http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo。 aspx

4
thitemple

ASP.NET MVC 3プロジェクトをいつでも作成できるので、ExceptionHandler属性を使用するのが最も簡単な方法だと思います。カスタムエラーページを使用し、通常どおりグローバルApplication_Errorメソッドで例外を処理するようにWeb.configを構成することはできますが、例外が発生すると、URLは新しいMVC 3の方法のように表示されません。

2
Tien Do

例外処理の方法をカスタマイズする場合は、MVCでカスタム例外を作成できます。ここで役立つ投稿を見つけることができます。 http://www.professionals-helpdesk.com/2012/07/creating-custom-exception-filter-in-mvc.html

1
pravin