在 ASP.NET Core Web API 中使用异常筛选器捕获和统一处理异常

news/2024/11/14 14:27:12/文章来源:https://www.cnblogs.com/JackyGz/p/18422993

image

前言

在 ASP.NET Core Web API 中,异常筛选器(Exception Filter)是一种用于处理发生在 Web API 控制器或管道中的异常的机制。

异常筛选器可以捕获和处理应用程序中发生的异常,当系统中出现未经处理的异常的时候,异常筛选器就会执行,我们可以在异常筛选器中对异常进行处理,例如记录日志、返回自定义错误信息等。

需要注意的是,只有 ASP.NET Core 线程中的未处理异常才会被异常筛选器处理。

本文主要通过一个实例来讲述在 ASP.NET Core Web API 中如何使用异常筛选器。

Step By Step 步骤

  1. 创建一个ASP.NET Core webapi 项目

  2. 编写自定义的异常筛选器 MyExceptionFilter,实现 IAsyncExceptionFilter 接口(注意其中的注释

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.Filters;public class MyExceptionFilter : IAsyncExceptionFilter
    {private readonly ILogger<MyExceptionFilter> logger;private readonly IHostEnvironment env;// 注入 ILogger 和 IHostEnvironment// IHostEnvironment 用于判断环境类型public MyExceptionFilter(ILogger<MyExceptionFilter> logger,IHostEnvironment env){this.logger = logger;this.env = env;}public Task OnExceptionAsync(ExceptionContext context){Exception exception = context.Exception;logger.LogError(exception, "UnhandledException occured");string message;if (env.IsDevelopment()){// 如果是开发环境,打印所有的异常堆栈信息message = exception.ToString();}else{// 否则只打印简单信息message = "程序中出现未处理异常";}// 设置响应报文的内容ObjectResult result = new ObjectResult(new { code = 500, message = message });result.StatusCode = 500;context.Result = result;// 设置context.ExceptionHandled的值为true,让ASP.NET Core不再执行默认的异常响应逻辑context.ExceptionHandled = true;return Task.CompletedTask;}
    }
    
  3. 打开 Program.cs,设置全局的筛选器(注意其中的注释

    using Microsoft.AspNetCore.Mvc;var builder = WebApplication.CreateBuilder(args);// Add services to the container.builder.Services.AddControllers();
    // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
    builder.Services.AddEndpointsApiExplorer();
    builder.Services.AddSwaggerGen();// 注册自定义异常过滤器服务
    // MvcOptions是ASP.NET Core项目的主要配置对象
    // 用于向Filters注册全局的筛选器
    builder.Services.Configure<MvcOptions>(opt => { opt.Filters.Add<MyExceptionFilter>();
    });var app = builder.Build();// Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {app.UseSwagger();app.UseSwaggerUI();
    }app.UseHttpsRedirection();app.UseAuthorization();app.MapControllers();app.Run();
    
  4. 打开控制器,模拟错误进行测试

    using Microsoft.AspNetCore.Mvc;namespace 异常筛选器.Controllers
    {[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private readonly ILogger<WeatherForecastController> _logger;public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;}[HttpGet(Name = "GetWeatherForecast")]public string Get(){throw new Exception("xxx");}}
    }
    

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),和你共同探索代码世界的奥秘!

image

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800638.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js实现网页端录音功能

1、代码 首先安装依赖包:recorderxnpm install recorderx -S<template><div class="container"><div class="mt-30"><el-button @click="onStartRecord">开始录音</el-button><el-button @click="onStop…

教你几招,轻松设置Win11右键恢复旧版模样

大家好!今天要教大家如何把 Win11 右键菜单变回完整的展开模式哦!其实很简单,只要在 Windows 开始图标下面的运行里输入一段代码就可以啦!接下来就让我来详细地跟大家分享一下这个方法吧!Win11右键菜单恢复为完整展开模式的方法1、首先,按键盘上的【 Win + X 】组合键,或…

第三周《密码系统设计》学习总结思维导图

marmaid代码为:graph LRA[密码系统设计第三周] --> B[《Windows C/C++ 加密解密实战》]B --> C[第四章]C --> T[4.2 加密基础]W --> U[CryptoAPI介绍]T --> V[加密概念]T --> X[加密类型]X --> d[对称加密]X --> e[非对称加密]T --> f[加密场景]C …

从虚拟到现实:数字孪生与数字样机的进化之路

​数字化技术高速发展的当下,计算机辅助技术已成为产品设计研发中不可或缺的一环,数字样机(Digital Prototype, DP)与数字孪生技术便是产品研发数字化的典型方法。本文将主要介绍数字样机与数字孪生在国内外的发展,并针对其技术痛点提出一种基于国产自研仿真工具进行虚拟模…

WPF 数据模板Data Template

数据模板 DataTemplate 控件模板决定了数据的展示形式和用户体检,在软件UI设计中非常重要。同样数据的展示形式越来越多样化,正所谓:横看成岭侧成峰,远近高低各不同。同样的数据内容,在DataGrid中的展示是文本的列表形式,在ComboBox中是下拉框的形式。给数据披上外衣,将…

性能测试之链接服务器实操

一、项目背景 因公司业务发展用户量增多,一些重要的接口请求也随着增多,导致接口响应变慢,需要优化接口的性能,所以团队里面就开始针对这些接口进行性能压力测试。二、前期准备工作 1、性能测试的服务器(不能在生产的机器上进行测试) 2、Jmeter压测工具三、操作流程 1、从…

记录一次fs配置导致串线的问题

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 fs在实际的使用过程中也会经常碰到莫名其妙的问题,大部分都是配置问题。 环境 CentOS 7.9 freeswitch 1.10.7 docker 26.1.1 问题描述 组网方案如下。其中的fs-reg是注册服务器,fs1和fs2是业务媒体服务器,B1B2是俩个B路…

WPF 模板总结(Template)

模板(Template): WPF系统不但支持传统的Winfrom编程的用户界面和用户体验设计,更支持使用专门的设计工具Blend进行专业设计,同时还推出了以模板为核心的新一代设计理念。 在WPF中,通过引入模板(Template)微软将数据和算法的“内容”与“形式”解耦了。模板是算法和数据的…

Linux-手动扩容磁盘分区

Linux-手动扩容磁盘分区 1. 手动扩容磁盘分区 实例演示:使用 fdisk 扩容 ext4 磁盘分区 在本示例中,我们将阿里云的高效云盘从50GB扩容到60GB。 1.1 扩容前检查磁盘分区信息检查并记录分区表信息: fdisk -l /dev/vdb输出示例: Disk /dev/vdb: 60 GiB, 64424509440 bytes, 1…

Linux系统使用 mkfs.xfs 格式化磁盘分区

Linux系统使用 mkfs.xfs 格式化磁盘分区 1.安装 xfs 工具集在 CentOS 7 上安装: yum install xfsprogs -y在 Ubuntu 18 上安装: apt-get install xfsprogs在 Arch Linux 上安装: pacman -S xfsprogs2.修改磁盘分区表使用 fdisk 创建分区: fdisk /dev/vdb使用 parted 创建分…

RTX腾讯通停止服务,有哪些低成本平滑升级迁移方案?

一、RTX腾讯通继续使用的核心痛点 自RTX腾讯通停更以及官网下架,直接切断了用户获取更新、技术支持及资源下载的渠道,更迫使用户面对一系列难以忽视的严峻问题: ● 在国产系统及移动端无法使用:RTX腾讯通仅兼容Windows与MAC系统,导致用户无法在国产操作系统以及移动端使用…

[ABC263G] Erasing Prime Pairs

题目思路 看到配对,想到网络流。 考虑如果一个点是奇数,那么将源点与其连接,如果是偶数,那么将汇点与其连接,如果一对奇数和偶数的和是质数,那么将它们两对应的点相连。其中,我们要对 1 特殊处理,因为 \(1 + 1 = 2\) 而 \(2\) 是偶数且是质数,所以考虑费用流,尽可能多…