2012-02-06 7 views
1

私はMVC3を利用しているウェブサイトを持っています。私はn階層アーキテクチャを持っており、どのレベルでエラーを捕捉するのが最善であるのか不思議です。または必要があります - StudentRepository.GetHightestGrade(studentId)MVC3エラーが発生するレベル

だから私は私のリポジトリ機能を持っている必要がありtry/catchブロックを持っていますのは、私は学生のテーブルをのような機能を持つStudentRepositoryを持っているとしましょうisntanceについて

try/catchをActionResult関数に直接記述しました。ビジネスクラスで追加するとうまくいくでしょうか?そして、私のActionResult関数は、

Business.GetHighestGrade(studentId)というような処理を行い、単純にtry/catchを持ち、リポジトリ関数を呼び出しますか?

答えて

1

でグローバルフィルタatributesにこのフィルタを追加します。通常は、ユーザーをエラーから保護するために、最上位層にtry/catchを配置するのが最善です。例外的な状況では、通常、下位レイヤーは例外をスローする必要があります。上位レイヤーでしかキャッチしないでください。

try/catchブロックがなくてもコードがはるかに読みやすくなっています。できればそれを避けて、MVC3 HandleErrorフィルタ属性でエラーメッセージを表示させます。しかし、例外がスローされた場合、操作を再試行したい場合があります。これは、試行錯誤の候補になります。

ELMAHを見てください。まず、例外を避けるコードを書くのに役立ちます。しかし、例外を予期している場合には明示的にtry/catchを実行し、それに応答して何らかのアクションをとる必要があります。

+0

私はこのルートにもっと固執することに決めました。実際に私がそれとしたいことがあるとき、私はエラーをキャッチします。 – Mitch

1

それはあなたがキャッチで何をしたいかによって決まります。ただ静かに失敗したいですか?エラーをログに記録しますか?何かが間違っていることをユーザーに知らせるためのビューを返すのですか?

ユーザーに通知するだけの場合は、コントローラーでキャッチしてください。 ログに記録してレポにキャッチして、ロギングサービスを使ってログを記録させる場合は、エラーをキャッチしてログに記録するサービスを使用することもできますが、 。

0

カスタム例外のグローバルフィルタ属性を記述する必要があります。そのフィルタですべての例外をキャッチし、表示に戻ります。その

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web; 
    using System.Web.Mvc; 
    using System.Text; 

    namespace Filters 
    { 
     public sealed class HandleException : FilterAttribute, IExceptionFilter 
     { 
      public void OnException(ExceptionContext filterContext) 
      { 
       if (filterContext == null) 
        throw new ArgumentException("filterContext"); 
       else if (typeof(AjaxException).IsInstanceOfType(filterContext.Exception) && !filterContext.ExceptionHandled) 
      { 
       filterContext.ExceptionHandled = true; 
       filterContext.HttpContext.Response.Clear(); 
       filterContext.HttpContext.Response.ContentEncoding = Encoding.UTF8; 
       filterContext.HttpContext.Response.HeaderEncoding = Encoding.UTF8; 
       filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; 
       filterContext.HttpContext.Response.StatusCode = 400; 
       filterContext.Result = new ContentResult 
       { 
        Content = "Unexpected error", 
        ContentEncoding = Encoding.UTF8, 
       }; 
      } 
     } 
    } 
} 

ような何か、あなたがスタックをバブリングからエラーを防止しようとしている場合は、本当に唯一のtry/catchのメソッドをラップする必要がありGlobal.asaxの

0

リポジトリレベルには、SQL例外を処理してエラーをログに書き込むtry-catch構造が必要です。ビジネスロジックが複雑でエラーや矛盾した状態が発生する可能性がある場合は、それをチェックしてエラーをログに書き込む必要があります。ユーザーに何か間違ったことを通知したい場合(ビジネスロジックが例外を提供する場合)、コントローラーのアクションでtry-catch構造を使用し、ModelState.AddModelError()をユーザーに通知する方法の1つとして使用するか、別の方法でエラーに関する情報を渡す必要があります見えるそして最後に、あなたclass CustomErrorFilter : IExceptionFilterはのApplication_Start中のglobal.asaxに登録されている必要があります:

フィルタは、コントローラレベルで発生するすべての未処理のエラーをログに書き込む必要があります
GlobalFilters.Filters.Add(new LoggingFilter()); 

通常のワークフローを提供し、エラーワークフローを提供することができます(エラーワークフローを整理する方法の1つとして例外をスローするか、エラーコードを返す)ことができます。あなたはそれを信じて両方のワークフローを処理する必要があります。

関連する問題