ASP.NET MVC統一異常処理

3217 ワード

前言:


今朝、知識を求めて中毒になって、作品の思考がありませんという文章を読みました.とても感触があって、もとは自分もこのようにすることを発见して、すべてのものに対してすべてとても大きい兴味を持ってあるいは自分で学ぶことを望んで、1年后にもとは自分が何も毛皮で何も精巧ではありませんことを発见します!最終的に本当の牛はすべてある分野の牛であることを発見して、全能ではありません.だから精を出す時だ.
この文章は今日の別の1編の読書に由来します:《私のソフトウェアはバグがありません》の作者は読者が書いたプログラムがすでにオンラインになっても自分のバグを迅速に発見することができることを望んで、ユーザーが我慢できない時のフィードバックを待っているのではありませんて、このようにユーザーに錯覚させます.だから子豚は今日、実は非常に長い間注目していたテーマを書きました.統一された異常処理です.

インプリメンテーション


ASP.NET MVCは、例外処理が必要なControllerでOnExceptionを書き換えるなど、例外処理を容易に行う仕組みを提供しています.プログラム全体に例外処理が必要な場合は、BaseControllerを1つ書き、他のすべてのControllerがそれを継承し、BaseControllerでOnExceptionを書き換えることができます.
protected override void OnException(ExceptionContext filterContext)

{

    Log(filterContext);

    base.OnException(filterContext);

}



private void Log(ExceptionContext filterContext)

{

    string fileName = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, exceptionFileName);

    StreamWriter sw = System.IO.File.AppendText(fileName);



    System.DateTime dt = DateTime.Now;

    string ip = RY.Common.IPHelp.ClientIP;

    string url = Request.Url.ToString();

    sw.Write(string.Format("Time:{0:G}; ClientIp:{1}; URL:{2}; Message:{3}
", dt, ip, url, filterContext.Exception.Message)); sw.Close(); }

そして自分のControllerをこのBaseControllerから継承すればよい.
また、アクションのキャプチャ例外のみについては、HandleErrorAttributeから継承されたAttributeを書くことができます.
public class ExceptionLogAttribute:HandleErrorAttribute

{

       public override void OnException(ExceptionContext filterContext)

       {

            base.OnException(filterContext);

       }

}

データベースを保存するかファイルを保存するか


注意深い読者は、上記のコードがウェブサイトとフォルダの下のファイルに保存されていることに気づくかもしれません.ここでは、異常データをどこに保存するかについての問題です.データベースとファイルの2つの選択があります.しかし、子豚はデータベースを保存する際に問題があることを考慮しています.データベースがリンクできない場合、ウェブサイトもエラーを報告します.このときのエラーは、データベースが存在するメカニズムを採用すると記録できませんが、ファイルにはこの問題はありません.ウェブサービスが走っていない限り.理由をまとめると、子豚はログファイルをファイルに保存する方法を取った.