经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
.Net 6.0全局异常捕获
来源:cnblogs  作者:沈威  时间:2023/3/22 9:27:39  对本文有异议

背景:

全局异常捕获是我们开发当中不可获取的一个环节,顾名思义就是全局的捕获异常,并响应出去,今天就带着各位童鞋们在.Net 6.0当中如何做到全局异常捕获.

思路:

我们可以通过请求管道达到我们全局的一个场景,所以我们第一步就是在请求管道中自定义一个全局异常捕获的中间件,并通过try catch来实现,是不是特别简单,好话不多说下面就带着各位步入正题!!!

实现:

1.在根目录中创建Middlewares文件夹,并创建ExceptionHandlingMiddleware类(自定义中间件)

 

 2.创建一个捕获异常后需要将错误信息响应出去的容器,哈哈哈大白话来说就是一个类,我这就暂命名为ActionTResult

 

 3.实现ExceptionHandlingMiddleware中代码逻辑,不卖关子,直接上代码!!!

  1. 1 /// <summary>
  2. 2 /// 全局异常捕获中间件
  3. 3 /// </summary>
  4. 4 public class ExceptionHandlingMiddleware
  5. 5 {
  6. 6 private readonly RequestDelegate _next; // 用来处理上下文请求
  7. 7 private readonly ILogger<ExceptionHandlingMiddleware> _logger;
  8. 8
  9. 9 public ExceptionHandlingMiddleware(RequestDelegate next, ILogger<ExceptionHandlingMiddleware> logger)
  10. 10 {
  11. 11 _next = next;
  12. 12 _logger = logger;
  13. 13 }
  14. 14
  15. 15 /// <summary>
  16. 16 /// 执行中间件
  17. 17 /// </summary>
  18. 18 /// <param name="httpContext"></param>
  19. 19 /// <returns></returns>
  20. 20 public async Task InvokeAsync(HttpContext httpContext)
  21. 21 {
  22. 22 try
  23. 23 {
  24. 24 await _next(httpContext); //要么在中间件中处理,要么被传递到下一个中间件中去
  25. 25 }
  26. 26 catch (Exception ex)
  27. 27 {
  28. 28 await HandleExceptionAsync(httpContext, ex); // 捕获异常了 在HandleExceptionAsync中处理
  29. 29 }
  30. 30 }
  31. 31
  32. 32 /// <summary>
  33. 33 /// 异步处理异常
  34. 34 /// </summary>
  35. 35 /// <param name="context"></param>
  36. 36 /// <param name="exception"></param>
  37. 37 /// <returns></returns>
  38. 38 private async Task HandleExceptionAsync(HttpContext context, Exception exception)
  39. 39 {
  40. 40 context.Response.ContentType = "application/json"; // 返回json 类型
  41. 41 var response = context.Response;
  42. 42 var errorResponse = new ActionTResult
  43. 43 {
  44. 44 Succes = SuccessTypeEnum.Error
  45. 45 }; // 自定义的异常错误信息类型
  46. 46 switch (exception)
  47. 47 {
  48. 48 case ApplicationException ex:
  49. 49 if (ex.Message.Contains("Invalid token"))
  50. 50 {
  51. 51 response.StatusCode = (int)HttpStatusCode.Forbidden;
  52. 52 errorResponse.ErrorMsg = ex.Message;
  53. 53 break;
  54. 54 }
  55. 55 response.StatusCode = (int)HttpStatusCode.BadRequest;
  56. 56 errorResponse.ErrorMsg = ex.Message;
  57. 57 break;
  58. 58 case KeyNotFoundException ex:
  59. 59 response.StatusCode = (int)HttpStatusCode.NotFound;
  60. 60 errorResponse.ErrorMsg = ex.Message;
  61. 61 break;
  62. 62 default:
  63. 63 response.StatusCode = (int)HttpStatusCode.InternalServerError;
  64. 64 errorResponse.ErrorMsg = "Internal Server errors. Check Logs!";
  65. 65 break;
  66. 66 }
  67. 67 _logger.LogError(exception.Message);
  68. 68 var result = JsonSerializer.Serialize(errorResponse);
  69. 69 await context.Response.WriteAsync(result);
  70. 70 }
  71. 71 }

4.在请求管道中直接使用即可

  1. 1 app.UseMiddleware<ExceptionHandlingMiddleware>();

效果:

  到这里其实我们已经实现了一个全局异常捕获了,我们一起来看看效果吧!

 

 

 

 在这里本章节就结束了,希望对在坐的各位童鞋有所帮助,当然如果有发现不足或者不对的地方也欢迎探讨,及时指正!!!

原文链接:https://www.cnblogs.com/shenweif/p/17236321.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号