.NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(上)...
22 | 異常處理中間件:區分真異常與邏輯異常
這一節我們來講解一下錯誤處理的最佳實踐
系統里面異常處理,ASP.NET Core 提供了四種方式
1、異常處理頁
2、異常處理匿名委托方法
3、IExceptionFilter
4、ExceptionFilterAttribute
源碼鏈接:
https://github.com/witskeeper/geektime/tree/master/samples/ExceptionDemo
Startup 的 Configure 方法
if (env.IsDevelopment()) {// 開發環境下的異常處理頁app.UseDeveloperExceptionPage(); }控制器拋出異常
throw new Exception("報個錯");啟動程序,可以看到一個錯誤頁
這個錯誤頁會輸出我們當前請求的詳細信息和錯誤的詳細信息,這種頁面是不適合給用戶看到的,所以這樣的錯誤頁在生產環境是需要關閉的
以下是正常處理錯誤頁的方式:
// 第一種方式就是定義錯誤頁的方式 app.UseExceptionHandler("/error");定義一個接口 IKnownException
namespace ExceptionDemo.Exceptions {public interface IKnownException{public string Message { get; }public int ErrorCode { get; }public object[] ErrorData { get; }} }默認實現 KnownException
namespace ExceptionDemo.Exceptions {public class KnownException : IKnownException{public string Message { get; private set; }public int ErrorCode { get; private set; }public object[] ErrorData { get; private set; }public readonly static IKnownException Unknown = new KnownException { Message = "未知錯誤", ErrorCode = 9999 };public static IKnownException FromKnownException(IKnownException exception){return new KnownException { Message = exception.Message, ErrorCode = exception.ErrorCode, ErrorData = exception.ErrorData };}} }為什么需要定義這樣一個類型呢?
因為通常情況下我們系統里面的異常和我們業務邏輯的異常是不同的,業務邏輯上面的判斷異常,比如說輸入的參數,訂單的狀態不符合條件,當前賬戶余額不足,這樣子的信息我們有兩種處理方式:
一種處理方式就是對不同的邏輯輸出不同的業務對象
還有一種方式就是對于異常的這種業務邏輯,輸出一個異常,用異常來承載邏輯的特殊分支,這個時候就需要識別出來哪些是業務的異常,哪些是不確定的未知的異常,比如說網絡的請求出現了異常,MySql 的連接閃斷了,Redis 的連接出現了異常
接著通過定義一個錯誤頁來承載錯誤信息,比如我們的 ErrorController,它只有一個頁面,它的作用就是輸出錯誤信息
namespace ExceptionDemo.Controllers {[AllowAnonymous]public class ErrorController : Controller{[Route("/error")]public IActionResult Index(){// 獲取當前上下文里面報出的異常信息var exceptionHandlerPathFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();var ex = exceptionHandlerPathFeature?.Error;// 特殊處理,嘗試轉換為 IKnownExceptionvar knownException = ex as IKnownException;// 對于未知異常,我們并不應該把錯誤異常完整地輸出給客戶端,而是應該定義一個特殊的信息 Unknown 傳遞給用戶// Unknown 其實也是一個 IKnownException 的實現,它的 Message = "未知錯誤", ErrorCode = 9999// 也就是說我們在控制器 throw new Exception("報個錯"); 就會看到錯誤信息if (knownException == null){var logger = HttpContext.RequestServices.GetService<ILogger<MyExceptionFilterAttribute>>();// 我們看到的信息是未知錯誤,但是在我們的日志系統里面,我們還是記錄的原有的異常信息logger.LogError(ex, ex.Message);knownException = KnownException.Unknown;}else// 當識別到異常是已知的業務異常時,輸出已知的異常,包括異常消息,錯誤狀態碼和錯誤信息,就是在 IKnownException 中的定義{knownException = KnownException.FromKnownException(knownException);}return View(knownException);}} }View
@model ExceptionDemo.Exceptions.IKnownException @{ViewData["Title"] = "Index"; }<h1>錯誤信息</h1><div>Message:<label>@Model.Message</label></div> <div>ErrorCode<label>@Model.ErrorCode</label></div>啟動程序之后可以看到自定義的錯誤頁已經成功渲染出來了
這就是第一種處理錯誤的方式
總結
以上是生活随笔為你收集整理的.NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(上)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编写高性能的C#代码(三)使用SPAN
- 下一篇: 你可能需要了解一下的中台