日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > asp.net >内容正文

asp.net

.NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(上)...

發(fā)布時間:2023/12/4 asp.net 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core开发实战(第22课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(上)... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

22 | 異常處理中間件:區(qū)分真異常與邏輯異常

這一節(jié)我們來講解一下錯誤處理的最佳實踐

系統(tǒng)里面異常處理,ASP.NET Core 提供了四種方式

1、異常處理頁

2、異常處理匿名委托方法

3、IExceptionFilter

4、ExceptionFilterAttribute

源碼鏈接:
https://github.com/witskeeper/geektime/tree/master/samples/ExceptionDemo

Startup 的 Configure 方法

if (env.IsDevelopment()) {// 開發(fā)環(huán)境下的異常處理頁app.UseDeveloperExceptionPage(); }

控制器拋出異常

throw new Exception("報個錯");

啟動程序,可以看到一個錯誤頁

這個錯誤頁會輸出我們當前請求的詳細信息和錯誤的詳細信息,這種頁面是不適合給用戶看到的,所以這樣的錯誤頁在生產環(huán)境是需要關閉的

以下是正常處理錯誤頁的方式:

// 第一種方式就是定義錯誤頁的方式 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 };}} }

為什么需要定義這樣一個類型呢?

因為通常情況下我們系統(tǒng)里面的異常和我們業(yè)務邏輯的異常是不同的,業(yè)務邏輯上面的判斷異常,比如說輸入的參數,訂單的狀態(tài)不符合條件,當前賬戶余額不足,這樣子的信息我們有兩種處理方式:

一種處理方式就是對不同的邏輯輸出不同的業(yè)務對象

還有一種方式就是對于異常的這種業(yè)務邏輯,輸出一個異常,用異常來承載邏輯的特殊分支,這個時候就需要識別出來哪些是業(yè)務的異常,哪些是不確定的未知的異常,比如說網絡的請求出現了異常,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>>();// 我們看到的信息是未知錯誤,但是在我們的日志系統(tǒng)里面,我們還是記錄的原有的異常信息logger.LogError(ex, ex.Message);knownException = KnownException.Unknown;}else// 當識別到異常是已知的業(yè)務異常時,輸出已知的異常,包括異常消息,錯誤狀態(tài)碼和錯誤信息,就是在 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课:异常处理中间件:区分真异常与逻辑异常)--学习笔记(上)...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。