首页 > 其他分享 >264 Exception Handling Middleware

264 Exception Handling Middleware

时间:2024-06-07 19:01:23浏览次数:22  
标签:app Exception Handling Middleware next httpContext ex logger public

示例

CRUDExample项目新建Middlewares文件夹,下面新建ExceptionHandlingMiddleware.cs(VS中有Middleware模板)

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Serilog;
using System.Threading.Tasks;

namespace CRUDExample.Middlewares
{
    // You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
    public class ExceptionHandlingMiddleware
    {
        private readonly RequestDelegate _next;
        private readonly ILogger<ExceptionHandlingMiddleware> _logger;  
        private readonly IDiagnosticContext _diagnosticContext;

        public ExceptionHandlingMiddleware(RequestDelegate next, ILogger<ExceptionHandlingMiddleware> logger, IDiagnosticContext diagnosticContext)
        {
            _next = next; //represents the subsequent middleware
            _logger = logger;
            _diagnosticContext = diagnosticContext;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            try
            {
                await _next(httpContext);  
            }
            catch (Exception ex)
            {
                if (ex.InnerException != null)
                {
                    _logger.LogError("{ExceptionType}{ExceptionMassage}", ex.InnerException.GetType().ToString(), ex.InnerException.Message);
                }
                else
                {
                    _logger.LogError("{ExceptionType}{ExceptionMassage}", ex.GetType().ToString(), ex.Message);
                }
            }
            httpContext.Response.StatusCode = 500;
            await httpContext.Response.WriteAsync("Error occurred");
        }
    }

    // Extension method used to add the middleware to the HTTP request pipeline.
    public static class ExceptionHandlingMiddlewareExtensions
    {
        public static IApplicationBuilder UseExceptionHandlingMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<ExceptionHandlingMiddleware>();
        }
    }
}

Program.cs

var app = builder.Build();

app.UseSerilogRequestLogging();

if (builder.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
}
else
{
    app.UseExceptionHandlingMiddleware();
}

注意

对于测试环境,按照上面的代码,如果有错误会显示详细的错误信息到页面;

对于生产环境,如果不使用自定义中间件抓取报错信息,页面会显示类似400、500等报错,使用自定义中间件后可以在页面展示自定义的容易理解的报错信息,比如“Error occurred”。

launchSettings.json中可以设置运行环境:

"environmentVariables": {
  "ASPNETCORE_ENVIRONMENT": "Production"
}

Gitee获取源码:

https://gitee.com/huang_jianhua0101/asp.-net-core-8.git

标签:app,Exception,Handling,Middleware,next,httpContext,ex,logger,public
From: https://blog.csdn.net/KevinHuang2088/article/details/139533952

相关文章

  • 265 Custom Exceptions(更容易定位报错内容具体是什么)
    优势CustomExceptions相比于ArgumentException/ArgumentNullException,更容易定位报错内容具体是什么,报错内容与具体业务相关。示例新建类库项目Exceptions,为Services/CRUDExample项目添加Exceptions项目引用Exceptions项目中添加InvalidPersonIdException.csnamespac......
  • Modbus.SlaveException
    Modbus.SlaveException是一个在Modbus通信协议中表示从机(Slave)错误的异常。Modbus是一种用于工业自动化领域的应用层协议,它允许控制器与设备(如PLC、传感器等)进行通信。在Modbus协议中,从机是指连接到Modbus网络上的设备,它们响应主控器(通常是PC或其他控制设备)的请求。......
  • java ArrayIndexOutOfBoundsException数组越界异常
    Java中的ArrayIndexOutOfBoundsException(数组越界异常)是一种运行时异常,表示访问了数组的非法索引位置。在数组中,索引从0开始,并以数组长度减一为上限。如果使用了小于0或大于等于数组长度的索引,就会抛出ArrayIndexOutOfBoundsException异常。以下是一个示例代码,演示了这个异常......
  • Java IOException输入输出异常
    Java的IOException是指在进行输入输出操作时产生的异常。它是IOException类或其子类的实例。IOException是一个受检异常,意味着在方法签名中必须声明或捕获它,否则代码将无法通过编译。常见的IOException包括:FileNotFoundException:当尝试打开文件时,如果指定的文件不存在。EOFE......
  • zookeeper:Unexpected exception, exiting abnormally ::java.io.EOFException
    转载请注明出处:服务器中断,重启服务器在重启kafka服务时,遇到如下报错:2024-06-0513:52:56,251[myid:]-ERROR[main:ZooKeeperServerMain@64]-Unexpectedexception,exitingabnormallyjava.io.EOFExceptionatjava.io.DataInputStream.readInt(DataInputStream.j......
  • Docker---java.sql.SQLNonTransientConnectionException: Could not create connectio
    文章目录一、问题场景二、问题分析及解决2.1问题分析2.2问题解决2.2.1有改动未重启容器2.2.2数据库配置不对三、结束一、问题场景使用docker容器控制数据库时,启动服务报错:java.sql.SQLNonTransientConnectionException:Couldnotcreateconnectiontodat......
  • [ROS报错问题]SystemError: initialization of cv_bridge_boost raised unreported ex
            在运行ROS代码时,很多人会使用到cv_bridge库,这个库的主要功能是帮助在ROS的图像消息(sensor_msgs/Image)和OpenCV的图像格式(cv::Mat)之间进行转换。然而,有时在使用cv_bridge时会遇到一个让人头疼的问题,即报错:fromcv_bridge.boost.cv_bridge_boostimportcvt......
  • 初学者springboot启动报错Caused by: java.lang.IllegalArgumentException: Invalid v
    本人第一次接触springboot框架本来想用mybatis连接数据库,引入mybatisplus配置就启动报错packagecom.hu.springboot_mybatis.dao;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.hu.springboot_mybatis.pojo.UserPojo;importorg.apache.ibatis.ann......
  • 记一次NoResourceFoundException: No static resource异常
    org.springframework.web.servlet.resource.NoResourceFoundException:Nostaticresource是Controller层,Rest接口的定义错误ApiPost工具访问,调用接口报错改为@RestController注解......
  • ### Cause: java.sql.SQLSyntaxErrorException: Expression #4 of SELECT list is not
    最近把线上数据库备份到本地数据库进行一些代码修改时候,发现代码连接本地数据库报错,线上数据库是正常的,后来查阅了一下是SELECT列表不在GROUPBY语句内且存在不函数依赖GROUPBY语句的非聚合字段,算是比较严谨的sql模式,如果需要解决的话需要修改一下my.ini配置页面,我先去自己安装......