MVC3エラーが発生するレベル

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

isntanceのために私はStudentsテーブルを持っているとしましょう。私はStudentRepositoryを以下のような関数で持っています: StudentRepository.GetHightestGrade(studentId)

私はRepositry関数にtry/catchブロックを持たせるべきですか?またはtry/catchをActionResult関数に直接置くべきですか?または、私はビジネスクラスでの追加のサービスを提供することになりますし、私のActionResult関数は

Business.GetHighestGrade(studentId)とその関数は単純にtry/catchを持ち、Repository関数を呼び出します。

1

4 答え

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

ユーザーに通知したい場合は、コントローラーでそれをキャッチします。 ログに記録し、レポでキャッチし、いくつかのログサービスを使ってレポをログに記録させたい場合は、エラーをキャッチしてログに記録するサービスを使用することもできますが、それはオーバーキルになる可能性があります。

1
追加された

スタックからバブルが発生するのを防ぐためにtry/catchでメソッドをラップするだけです。通常は、ユーザーをエラーから保護するために、最上位層にtry/catchを配置するのが最善です。例外的な状況では、通常、下位レイヤーは例外をスローする必要があります。上位レイヤーでしかキャッチしないでください。

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

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

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

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

    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,
                };
            }
        }
    }
}

global.asaxのグローバルフィルタatributesにこのフィルタを追加します

0
追加された

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

GlobalFilters.Filters.Add(new LoggingFilter());

そのフィルタは、コントローラレベルで発生するすべての未処理のエラーをログに書き込む必要があります。

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

0
追加された