2

ASP.NET MVC での例外処理に関する記事を読みました。簡単に説明することで、自分が正しく行っていることを確認したいと思います。どなたかコメントいただけませんか。

  1. 必要に応じて、コントローラー アクションで例外をキャッチします。

    [HttpPost]
    public ActionResult Insert()
    {
        try
        {
    
        }
        catch
        {
            //ModelState.Error -> display error msg to the user.
        }
    }
    
  2. basecontroller のコントローラーの「OnException」メソッドをオーバーライドし、ステップ 1 で発生した例外とその他の MVC 例外を「ログに記録」します。

  3. グローバル例外を application_onerror に記録しました。

4

3 に答える 3

2

このコードを自分で書くのではなく、ELMaH をお勧めします。また、MVC アプリには Log4Net を使用することをお勧めします。私は個人的に例外処理を避けています。このようにして、ELMaH などのアプリケーション全体のツールが適切に処理するエラーを「食べる」ことはありません。

ELMaH には優れた Web レポートも組み込まれており、ELMaH 専用のサードパーティ製ツールがあり、最も頻繁に発生するエラーなどの統計情報を得ることができます。

カスタムエラーリダイレクトから始めるかもしれません...

<customErrors defaultRedirect="~/site/error" mode="RemoteOnly">
  <error statusCode="404" redirect="~/site/notfound" />
</customErrors>

...ELMaH を使用していることを認識しているコントローラーに...

public virtual ActionResult Error() {
    System.Collections.IList errorList = new System.Collections.ArrayList();
    ErrorLog.GetDefault(System.Web.HttpContext.Current).GetErrors(0, 1, errorList);
    ErrorLogEntry entry = null;
    if (errorList.Count > 0) {
        entry = errorList[0] as Elmah.ErrorLogEntry;
    }
    return View(entry);
}

...訪問者が特定のエラー ID を取得するのに役立つビューに支えられています。

@model Elmah.ErrorLogEntry

@if (Context.User.Identity.IsAuthenticated) {
    <p>Since you are signed in, we've noted your contact information,
    and may follow up regarding this to help improve our product.</p>
} else {
    <p>Since you aren't signed in, we won't contact you regarding this.</p> 
}
<p>Error ID: @Model.Id</p>

この例では、これが HttpPost であることにも気付きました。AJAX を使用している場合は、それらのエラーを独自の方法で処理する必要があります。すべての AJAX コードが正常に処理される、ブラウザーに送信できる標準応答を選択します。おそらく、JavaScriptアラートにELMaHエラーIDを表示することによって(簡単な例として)。

また、Global.asax を介していくつかの特殊なタイプの AJAX エラーを処理します。

protected void Application_EndRequest()
{
    if (Context.Response.StatusCode == 302 &&
        Context.Request.Headers["X-Requested-With"] == "XMLHttpRequest")

HandleErrorAttribute は便利な機能ですが、ELMaH と組み合わせて使用​​するには余分な作業があることはよく知られています。ELMAH を ASP.NET MVC [HandleError] 属性で動作させるにはどうすればよいですか?

于 2012-08-31T04:32:06.327 に答える
2

アクションで例外を処理したい場合は、次のようにコントローラーで「OnException」をオーバーライドできます。

protected override void OnException(ExceptionContext filterContext)
{
  logging or user notification code here
}

重複を防ぐために BaseController クラスに入れることができます

于 2012-08-31T04:20:05.390 に答える
0

trycatchは予想される例外用です。つまり、ユーザーがファイル名を入力しましたが、存在しない可能性があるため、FileNotFoundException.

予期しない例外の場合は、MvcApplication オブジェクトの Error イベントを使用します。

public class MvcApplication : HttpApplication
{
    protected void Application_Start()
    {
        this.Error += MvcApplication_Error;
        // Other code
    }

    private void MvcApplication_Error(object sender, EventArgs e)
    {
        Exception exception = this.Server.GetLastError();
        // Do logging here.
    }
}

または、Dimaが提案したように、コントローラーレベルの実行処理を使用しています

protected override void OnException(ExceptionContext filterContext)
{
   // Do logging here.
}

予期されるものをキャッチして処理できるコードのトライ アンド キャッチを保持します。「一般的な」エラー処理は、後で掘り下げる必要がある根本的な問題を難読化するだけです。

于 2012-09-05T14:08:00.010 に答える