1. ホーム
  2. Web プログラミング
  3. ASP.NET

ASP.NET Coreミドルウェアによるグローバル例外処理機構の利用について

2022-01-14 11:16:57

まえがき

よく耳にする「"」。 修正に数秒、本稼働に数秒 "を見て、すごいと思いました。

実は、そうではないんです。あくまでお遊びで、問題が発生する可能性はいろいろあります(ロジックバグ、コードの例外、間違ったやり方など)。

今日は、コード例外の問題を素早く突き止め、無駄な時間を減らす方法についてお話しましょう。

本日のテーマは、データベース(mongodb、SqlServer、MySQLなど)に格納された例外をキャッチするための「グローバル例外処理機構の追加」です。

PS : 出力されるtxtの文字が不親切で、誰でもサーバーにログインできるわけではありません。

<ブロッククオート

例外とは、適切に処理されないとプログラムが予期せず終了してしまう可能性のある実行時エラーのことです。

1. プロジェクトの作成

を作成します。 ASP.NET Core Web API プロジェクトで NET Core3.1 .

2. グローバルな例外フィルタを作成する

コントローラ内に例外フィルタを作成します。 ExceptionFilter.cs このフィルタは IExceptionFilter インターフェイスを使用します。

を使っていることに注意してください。 efcore+sqlserver お好みでお使いください ORM とデータベースのアプローチについて説明します。

 例外フィルターとは、その名の通り、プログラム中に例外が発生したときに使用するフィルターである。システムで捕捉できない例外を処理するために使用される。

カスタム例外フィルタを実装し、グローバル例外フィルタをカスタマイズするには、以下の実装が必要です。 IExceptionFilter インターフェイスを使用します。

IExceptionFilter インタフェースの実装が必要になります。 OnException このメソッドは、システムでキャッチできない例外が発生したときに起動されます。

OnExceptionメソッドには ExceptionContext 例外コンテキストは、その例外コンテキストが持つ特定の例外情報を含んでいます。 HttpContext mvc ルーティング情報

システムがキャッチできない例外を発生させたら、修正とデバッグを容易にするために、ロギングツールを使用して例外の詳細を記録するのがより一般的な方法です。

以下は、ロギングの実装です。

Mvc.Filters;
Filters; using System;

namespace Log4NetWebAPI.
Controllers
    public class ExceptionFilter: IExceptionFilter
    {
        //global exception handling mechanism
        public void OnException(ExceptionContext context)
        {
            Exception ex = context;

            //The name of the controller method where the error is located
            var DisplayName = context.ActionDescriptor;

            #region The line number where the error is located line number

            The name before the line number of //// is either Chinese or English, so pay attention to the screening
            //var aaa = ex.StackTrace.Substring(ex.StackTrace.IndexOf("LineNumber"), ex.StackTrace. ;
            //var ccc = ex.StackTrace.Substring(ex.StackTrace.IndexOf("line"), ex.StackTrace.Length - ex.StackTrace.IndexOf("line& quot;));
            var lineNumber = 0;
            const string lineSearch = ":line ";
            var index = ex.StackTrace.LastIndexOf(lineSearch);
            if (index ! = -1)
            {
                var lineNumberText = ex.StackTrace.Substring(index + lineSearch.Length);
                var lineNumberStr = lineNumberText.Substring(0, lineNumberText.IndexOf("\r\n"));
                if (int.TryParse(lineNumberStr, out lineNumber))
                {

                }
            }

            #endregion

            #region Write the information to [database], here you can enter the database yourself (mongodb, SqlServer, MySQL, etc.), I'll use SqlServer as an example

            errorLog md = new errorLog();
            md.logTime = DateTime.Now;
            md.logType = "error";
            md.displayName = DisplayName; // error location
            md.lineNumber = lineNumber; // error line number
            md.message = ex.Message; //error message
            md.messagedetails = ex.ToString(); //error details
            md.createTime = DateTime.Now;

            using (var ctx = new dbContext())
            {

                ctx.Add(md);
                ctx.SaveChanges();
            }
            #endregion

            // Here's a hint of what your return page will show, omitted below

        }
    }
}



3. 依存性注入グローバル例外処理機構

での Startup.cs 先ほどミドルウェアに作成したグローバルな例外処理機構を ConfigureServices メソッドを呼び出します。

// グローバルな例外処理機構を追加する
services.AddMvc(option => {)
  option.Filters.Add<ExceptionFilter>() を実行します。
});

// このメソッドはランタイムから呼び出されます。コンテナにサービスを追加するには、このメソッドを使用します。 public void ConfigureServices(IServiceCollection services) サービス services.AddControllers()。 // グローバルな例外処理機構を追加する services.AddMvc(option => {) option.Filters.Add<ExceptionFilter>(); }); }

4. グローバルな例外処理機構のテスト

を配置します。 string string to int type"、以下のコードは間違いなくエラーを報告しているので、エラーメッセージをライブラリに取り込みましょう。

<ブロッククオート

var numberNo = "私はシリアルナンバーです"。
// ここではint型に変換され、データソースがstringであるため、エラーを報告しなければならず、その後、グローバルにキャプチャします。
//ここでtry catchを書かないことに注意
var number = Convert.ToInt32(numberNo)。

プロジェクトを実行した後、データベースに問い合わせを行い、以下のようなエラーメッセージを取得したことを確認します。

エラー時刻:2021-09-28 15:12:58.307

ログタイプ:エラー

エラーの発生したメソッドの場所 Log4NetWebAPI.Controllers.WeatherForecastController.Get (Log4NetWebAPI)

行数が間違っています:36行

エラーメッセージです。入力文字列が正しい形式ではありません。

以下は、コントローラメソッドのスクリーンショットです。

この時点でこの記事の ASP.NET Core これは、ミドルウェアのグローバルな例外処理機構の使用に関する記事の最後に、より関連する ASP.NET Core グローバル例外処理機構の詳細については、Scripting Houseの過去の記事を検索していただくか、引き続き以下の関連記事をご覧ください。