首页 > 编程语言 >ASP.NET 8 中的 ExceptionHandler【转】

ASP.NET 8 中的 ExceptionHandler【转】

时间:2024-01-18 14:15:18浏览次数:29  
标签:exception ASP 处理 app 中间件 ExceptionHandler new NET

Intro

ASP.NET 8 中引入了 IExceptionHandler,我们可以针对某一类的 exception 做单独的处理,
可以将不同类型的异常有不一样的逻辑做不同的处理,异常处理可以变得更加灵活

Sample

来看一个简单的示例:
我们可以实现 IExceptionHandler 来处理异常:

file sealed class ArgumentExceptionHandler : IExceptionHandler
{
    public async ValueTask<bool> TryHandleAsync(HttpContext httpContext, Exception exception, CancellationToken cancellationToken)
    {
        httpContext.RequestServices.GetRequiredService<ILogger<ArgumentExceptionHandler>>()
            .LogError(exception, "Exception handled");
        if (exception is not ArgumentException) return false;

        httpContext.Response.StatusCode = 400;
        await httpContext.Response.WriteAsJsonAsync(new
        {
            exception.Message
        }, cancellationToken);
        return true;
    }
}

只需要实现 TryHandleAsync 方法即可,返回值是 true 代表已经已经处理 ,无需后面的 exception handle 逻辑再处理,false 则需要后面的逻辑进行处理

完整的 web app 示例如下:

通过 AddExceptionHandler() 来注册我们自定义的异常处理,可以注册多个,如果有多个要注意注册顺序,像中间件一样,先注册的 handler 会先执行

另外需要通过 UseExceptionHandler() 注册 ExceptionHandler 中间件

需要指定一下 exception handler 未处理的情况下的 exception 路由 ExceptionHandlingPath 或者 exception 处理逻辑 ExceptionHandler

var builder = WebApplication.CreateSlimBuilder(args);
builder.Services.AddExceptionHandler<ArgumentExceptionHandler>();
var app = builder.Build();

app.UseExceptionHandler(new ExceptionHandlerOptions()
{
    // ExceptionHandlingPath = "/",
    ExceptionHandler = context =>
    {
        context.Response.StatusCode = 500;
        context.Response.WriteAsJsonAsync(new
        {
            title = "Internal Error",
            traceId = context.TraceIdentifier
        });
        return Task.CompletedTask;
    }
});
app.MapGet("/", () => "Hello .NET 8!");
app.MapGet("/exception", () =>
{
    throw new InvalidOperationException("Oh no...");
});
app.MapGet("/argument-exception", () =>
{
    throw new ArgumentException("Oh no...");
});
await app.RunAsync();

我们在示例中添加了三种效果,没有异常、InvalidOperationException/ArgumentException

这样我们可以把 exception 分层处理,不同的处理逻辑放在不同的 exception handler 中,不需要定义在一个地方,这样就灵活了许多,相当于中间件里套了一层中间件,套娃,嘿嘿

标签:exception,ASP,处理,app,中间件,ExceptionHandler,new,NET
From: https://www.cnblogs.com/fanfan-90/p/17972366

相关文章

  • 使用日志类库log4net.dll出现代码loginfo.IsInfoEnabled等于false的解决办(转)
    按语:   工程进行了裁剪,发现原来的日志功能失效了,调试时发现loginfo.IsInfoEnabled一直为false。后参考下面博客内容修改了log4net.config的文件属性修改,解决问题。===========================================================================在使用wpf开发日志方面......
  • 将.NET Core项目部署到Azure App Service
    步骤1:创建ASP.NETCoreWeb应用首先,确保你已经安装了.NETCoreSDK。dotnetnewwebapp-nAzureSampleAppcdAzureSampleApp这将创建一个新的ASP.NETCoreWeb应用,并将目录更改为新创建的应用目录。步骤2:一个简单的首页编辑Pages/Index.cshtml文件,添加一些内容来展......
  • .NET Core如何调SAP接口-.NET Core如何调WebService接口
     情况说明 客户提供一个SAP接口,接口通过浏览器可以打开查看,如下图: 输入帐号密码后登录: 接口开发连接接口服务上述情况,SAP接口已就绪,现在开始开发接口调用。首先,创建.NETCoreWeb项目,然后如下图,连接接口服务。           创......
  • 记一次 .NET某道闸收费系统 内存溢出分析
    一:背景1.讲故事前些天有位朋友找到我,说他的程序几天内存就要爆一次,不知道咋回事,找不出原因,让我帮忙看一下,这种问题分析dump是最简单粗暴了,拿到dump后接下来就是一顿分析。二:WinDbg分析1.程序为什么会暴程序既然会爆,可能是虚拟地址受限,也可能是系统内存不足,可以用!address......
  • rke2 offline install kubernetes v1.26.12
    文章目录1.准备2.安装ansible3.基础配置3.1配置hosts3.2安装软件包3.3内核参数3.4连接数限制3.5关闭swap、selinux、防火墙3.6时间同步4.RKE2安装4.1下载安装4.2配置其他管理节点4.3新增worker节点1.准备7台主机主机名ipcpu内存diskos角色user密码kube-mast......
  • EtherCAT转PROFINET网关-TEC-380
    TEC-380实现PROFINET控制器和EtherCAT从站设备之间的数据通信,可将多达32个EtherCAT设备连接到PROFINET(RT和IRT)网络。采用ECATStart图形化配置,支持EtherCAT从站设备描述文件(ESI)解析,同时还支持EtherCAT从站热插拔功能。  产品特点:1、实时性强:最短2ms协议转换时间;2、使用方......
  • Istio从入门到精通—— 安装 —— Kubernetes 删除 istio-system namesapce 时候,出现
    Kubernetes删除istio-systemnamesapce时候,出现Terminating解决办法当你在Kubernetes中遇到无法删除处于Terminating状态的命名空间时,可能是由于该命名空间中仍有活跃的资源或服务。要解决这个问题,你可以尝试以下几个步骤:一、常规方法检查命名空间中的活跃资源:......
  • Broodstock breeding behaviour recognition based on Resnet50-LSTM with CBAM atten
    一区top,2022年ComputersandElectronicsinAgriculture分类题目:“基于CBAM注意机制Resnet50-LSTM的亲鱼繁殖行为识别”(Du等,2022,pp.-)(pdf)“BroodstockbreedingbehaviourrecognitionbasedonResnet50-LSTMwithCBAMattentionmechanism”(Du等,2022......
  • C# 中,可以使用 System.Net.Sockets 命名空间中的 UdpClient 类来发送和接收 UDP 数据
    C#中,可以使用System.Net.Sockets命名空间中的UdpClient类来发送和接收UDP数据报文。以下是一个简单的C#示例,演示如何使用UDP发送和接收数据:点击查看代码usingSystem;usingSystem.Net;usingSystem.Net.Sockets;classProgram{staticvoidMain(){......
  • 从Netty到DotNetty
    Netty是什么Netty是一款用于创建高性能网络应用程序的高级框架。Netty是一款异步的事件驱动的网络应用程序框架,支持快速地开发可维护的高性能的面向协议的服务器和客户端DotNetty是什么DotNetty是微软的Azure团队仿造Netty编写的网络应用程序框架。优点关注点分离——业......