Exception ASP.NET核心Web Api中间件自定义异常

Exception ASP.NET核心Web Api中间件自定义异常,exception,asp.net-core,asp.net-core-webapi,asp.net-core-middleware,Exception,Asp.net Core,Asp.net Core Webapi,Asp.net Core Middleware,ASP.NET核心Web Api中间件将自定义异常转换为基本异常 我创建了一个自定义异常类,并使用它抛出异常。中间件捕获它,但抛出基本异常,而不是自定义异常。我无法理解为什么它不能捕获自定义异常 自定义异常 公共类CustomException:异常 { public int HttpStatusCode{get;private set;} 公共自定义例外() { } 公共CustomException(int-httpStatusCode,字符串消息):基本(消息) { HttpStatusC

ASP.NET核心Web Api中间件将自定义异常转换为基本异常

我创建了一个自定义异常类,并使用它抛出异常。中间件捕获它,但抛出基本异常,而不是自定义异常。我无法理解为什么它不能捕获自定义异常

自定义异常

公共类CustomException:异常
{
public int HttpStatusCode{get;private set;}
公共自定义例外()
{
}
公共CustomException(int-httpStatusCode,字符串消息):基本(消息)
{
HttpStatusCode=HttpStatusCode;
}
}
中间件

公共类例外中间件
{
public readonly RequestDelegate\u next;
公共例外中间件(RequestDelegate next)
{
_下一个=下一个;
}
公共异步任务InvokeAsync(HttpContext HttpContext)
{
尝试
{
等待下一步(httpContext);
}
捕获(自定义异常)
{
等待HandleExceptionAsync(httpContext,ex);
}
捕获(例外情况除外)
{
等待HandleExceptionAsync(httpContext,ex);
}
}
私有静态任务HandleExceptionAsync(HttpContext上下文,异常ex)
{
int statusCode=(int)HttpStatusCode.InternalServerError;
如果(ex为自定义例外)
{
CustomException se=ex作为CustomException;
statusCode=se.HttpStatusCode;
}
context.Response.ContentType=“应用程序/json”;
context.Response.StatusCode=状态码;
返回context.Response.WriteAsync(JsonConvert.SerializeObject(新的InternalServerErrorResponse(ex.Message));
}
}
引发异常

抛出新的CustomException(StatusCodes.Status422UnprocessableEntity,“用户已注册!”);
当抛出异常时,中间件不会捕获自定义异常,而是捕获基本异常。它总是转到下面的代码块

catch(异常示例)
{
等待HandleExceptionAsync(httpContext,ex);
}

请告知。

您必须告诉您的应用程序在
启动
类中的
配置
方法中使用此
中间件
,如下所示-

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerManager logger){
    app.ExceptionMiddleware();
}

您可以使用异常过滤器来处理异常并轻松地操纵响应

public class ExceptionFilter : IExceptionFilter
{


    public ExceptionFilter(IHostingEnvironment env, ILogger<JsonExceptionFilter> logger)
    {
        _env = env;
        _logger = logger;
    }

    public void OnException(ExceptionContext context)
    {
        var error = new ApiResponse();
        var exceptionName = context.Exception.GetType().Name;
        var message = context.Exception.Message;

        if (_env.IsDevelopment())
        {
            error.Message = context.Exception.Message;
            error.Detail = context.Exception.StackTrace;  
        }
        else
        {
           //Prevent To Show Exception Messages On Production
            error.Message = "Server Error Occured";
            error.Detail = "Something wrong happened";  
        }

        context.Result = new ObjectResult(error)
        {
            //Manipulate Status Code
            StatusCode = 500
        };
    }

}
公共类例外过滤器:IEExceptionFilter
{
公共例外过滤器(IHostingEnvironment环境、ILogger记录器)
{
_env=env;
_记录器=记录器;
}
公共无效OneException(ExceptionContext上下文)
{
var error=新的ApiResponse();
var exceptionName=context.Exception.GetType().Name;
var message=context.Exception.message;
如果(_env.IsDevelopment())
{
error.Message=context.Exception.Message;
error.Detail=context.Exception.StackTrace;
}
其他的
{
//阻止在生产上显示异常消息
error.Message=“发生服务器错误”;
error.Detail=“发生了错误”;
}
context.Result=新的ObjectResult(错误)
{
//操纵状态代码
状态代码=500
};
}
}
并注册到Startup.cs

public void ConfigureServices(IServiceCollection services){

        services.AddMvc(options =>
        {
            //Catch the exceptions
            options.Filters.Add<ExceptionFilter>();
        }).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

 }
public void配置服务(IServiceCollection服务){
services.AddMvc(选项=>
{
//抓住例外
options.Filters.Add();
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}

您是否已更改您的
启动
类以使用此
中间件
?2个问题:a)此异常是否在同一项目中定义/在同一项目中引发b)是否验证它是否到达引发异常的部分?a)自定义异常类在另一个项目中定义,并且主项目包含参考它。B) 不理解您的第二个问题无法重现,这在添加
app.useMidleware(typeof(ExceptionMiddleware))后有效
app.UseMvc()之前此代码已经存在。如果它在Configure方法中,那么中间件就不会捕获异常。无论我使用中间件还是异常过滤器,context.exception始终是System.exception而不是CustomException。我可以看到CustomException设置的错误消息。CustomException类有一些属性,由于基本异常类的原因,我无法在筛选器或中间件中访问这些属性。我正在使用Asp.NETCore2.2