ASP.NET Coreミドルウェアによるグローバル例外処理機構の利用について
まえがき
よく耳にする「"」。 修正に数秒、本稼働に数秒 "を見て、すごいと思いました。
実は、そうではないんです。あくまでお遊びで、問題が発生する可能性はいろいろあります(ロジックバグ、コードの例外、間違ったやり方など)。
今日は、コード例外の問題を素早く突き止め、無駄な時間を減らす方法についてお話しましょう。
本日のテーマは、データベース(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の過去の記事を検索していただくか、引き続き以下の関連記事をご覧ください。
関連
-
ASP.NET Core 6で依存関係を解決する3つの方法
-
.NET複数データベース一括データ挿入、更新(SqlServer、MySql、PgSql、Oracleをサポートします。)
-
30分でわかるコング経由の.NETゲートウェイ
-
ネットのメモリ管理に関する5つの基本
-
swagger uiをasp.net coreに統合する原理
-
ASP.NET学習でよくあるエラーのまとめ
-
ネットパフォーマンスチューニング - ArrayPool 詳細
-
Net CoreによるAutoFacの利用
-
asp.net core3.1 cookieとjwtのハイブリッド認証による多様な認証ソリューションの実現
-
名前 'xxx' が現在のコンテキストに存在しない エラー解決方法の1つ
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
pythonでpillowをインストールする3つの方法
-
NET6新機能 - 暗黙の名前空間参照
-
NET6新機能 新構造体の最適化
-
ASP.NET Core Dependency Injectionフレームワークの活用
-
ASP.NET Core ディペンデンシーインジェクションの詳細
-
ASP.NETでWeb.configからログインする際の正しいアカウントパスワードを確認する
-
ASP.NET Core MVC Dependency Injection ビューとコントローラ
-
ASP.NET Core Web API チュートリアル プロジェクト構成図
-
.NET 6における暗黙の名前空間参照
-
ASP.NETのオンライン統計とアプリケーションとセッションを使用した訪問履歴