いないすべての例外は、より困難になるコード変更の量の増加に伴って、フォローアップ中のシステムに一度の例外処理メカニズムを変更するために反復コードの多くにつながる可能性のtry-catchプロセスを繰り返すことが必要です。
特に、ASP.NETのWeb APIこのようなグローバル例外フィルタ機能の増加、開発者が利用できる多くのフィルタがあるが、アスペクト指向プログラミングを実装することを選択し、彼らは多くのを作り、この目標道路上の反復コーディングを置き換えます貢献度、可読性を向上させるために、ポスト保守コードの難しさを軽減しながら。
ほとんどのtry-catchの例外処理は、通常、同じ文言(例外ログレコードは、エラーメッセージなどを返します)ですので、例外も使用せずに、発生したときに、私たちはそのAPIので、統合されたフィルタでそれらを書くことができtry-位置ネストされた例外とソリューションをキャッチし、自動的に必要な例外処理を入力することが可能です。
注:これは、使用されているWeb APIのために特別にグローバル例外ハンドラです。コントローラの場合は、それが理由ように、通常のページビューを含む通常の状況下ではMVCコントローラのリターンJSON文字列、ファイルファイル、JSON文字列とだけでなく、グローバルな例外処理機構の別のセットを持っています。
スタートを切る
ここでは、グローバルな例外ハンドラを有効にする方法を説明するための例として、フィルタコードを扱う簡単な例外があります。
1.クラスMyExceptionFilterAttribute、相続ExceptionFilterAttribute、System.Web.Mvc.IExceptionFilterを作成し、インターフェイスメソッドを実装
Newtonsoft.Jsonを使用しました。
System.Net.Httpを使用しました。
System.Web.Http.Filtersを使用しました。
System.Web.Mvcを使用しました。
WebAPITest.Filters名前空間
{
publicクラスのMyExceptionFilterAttribute:ExceptionFilterAttribute、System.Web.Mvc.IExceptionFilter
{
// MVCフィルタは、このインタフェース要件を継承するには、登録を許可しなければならないが、我々は達成継承することができますが、それを書いていません。
onExceptionを公開(ExceptionContext filterContext)を無効
{
)(新しい新しいNotImplementedExceptionをスロー;
}
// APIは、この男は例外であるとき真のグローバル例外フィルタが有効になることができます:
ます。public voidオーバーライドonExceptionを(HttpActionExecutedContext actionExecutedContext)
{
base.OnException(actionExecutedContext)。
actionExecutedContext.Response =新しいHttpResponseMessage(){内容=新しいStringContent( "出现异常")}。
返します。
}
}
2.これに登録するグローバル例外ハンドラを終了します。
したがって、フィルタ効果を作るために、フィルタとして登録App_Start下のフォルダFilterConfig.csを開きます。
特記事項:グローバルに登録すると、例外が発生したすべてのために、フィルタが有効になります。
公共の静的な無効RegisterGlobalFilters(GlobalFilterCollectionフィルター)
{
filters.Add(新MyExceptionFilterAttribute());
}
機能タグとして使用します
もちろん、外部のグローバルな例外フィルタに登録し、上述したMyExceptionFilterAttributeに加えて、APIの特定のメソッドのために単独で使用することができる:(方法自体は、フィルタが「キャッチ」で、「試す」であることに注意してください。もはや、生体内で必要とされませんもう一度試してキャッチ)
System.Net.Httpを使用しました。
System.Web.Httpを使用しました。
WebAPITest.Filtersを使用しました。
WebAPITest.Modelsを使用しました。
WebAPITest.Controllers名前空間
{
//あなたはまた、例外処理をした[MyExceptionFilter] APIクラスが受け入れられるにはすべてのインターフェイスを表し、この場所でのタグのプレイを絞り込むことができます。
TestControllerクラス公開:ApiController
{
ここでプレーする[MyExceptionFilter] //フィーチャータグは、その後、UserException治療MyExceptionFilterAttributeの珍しい方法は、例外をトリガします。
HttpResponseMessage UserException公開()
{
スロー新しい新しいUserException( "ユーザ例外");
}
[MyExceptionFilter] //上記は、この機能は例外でのSystemExceptionラベルの契約をするのに役立ちます。
HttpResponseMessageのSystemExceptionパブリック()
{
スロー新しい新しい例外();
}
}
}
重点課題とラベルのグローバル登録
特徴タグは、複数のグローバルレジスタは、グローバルタグが登録されている場合、その後、単独で別のタグを最終処理またはあるメソッド名、クラス名、上にヒットした、メソッド名に別々のクラス名の混合物であってもよいですアプローチがトリガされるのでしょうか?
実際には、これらの人の優先順位と優先順位CSSのカスケーディングスタイルシートと類似。
我々はグローバルフィルターAを登録した場合は、しかし、一番上に別のB ApiControllerクラスをプレイするだけでなく、アクションメソッドに第三の例外ハンドラCを再生するには、デフォルトでは、最も近いアクションCを実行します:それはありますプロセッサは、それは言うことです:のActionFilter> ClassFilter> GlobalFilter。
また、すなわち、完全な力に繰り返し、必要に応じて:、グローバルなコントローラクラスに一度、アクション一度、ラベル[AttributeUsage(AttributeTargets.All、AllowMultiple =真)]フィルタの上部に追加する必要があり、その後、トリガ時に異常彼らは、複数の実行をサポートすることができるようになります。
もちろん、実際の例外処理も複雑なコンテンツの多くを含み、これはただの概要です。例えば、戻り値は、コール例外処理ツールは、GET / POSTリクエストのための治療方法における異常な差異をもたらす、サーバ録画、録画リクエストパラメータに異常情報を送信する(状態コード、メッセージ、応答内容の流れ、等を含む)の正規化される必要があります。
しかし、私たちのアイデアを提供するためにここにいる開発効率が実際より多くの方法と可能性を持つことができ、あなたが知っているコードを合理化、改善することです。そして、あなたは、特定の手順が繰り返されていること、それは初期の開発者が解決策を提案されている必要があります、そしてあなたがそれらを見つける必要があると感じたときに、同じ方法を使用する必要はありません。