为什么我的错误处理程序在 asp net 中不起作用?

Why does my error handler doesn't work in asp net?

提问人:Winter Wind 提问时间:11/16/2023 最后编辑:marc_sWinter Wind 更新时间:11/16/2023 访问量:65

问:

我在 ASP.NET Core 7.0 中使用全局错误处理程序:

public class ErrorHandlingMiddleware
{
        private readonly RequestDelegate _next;
    
        public ErrorHandlingMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        public async Task InvokeAsync(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (Exception err)
            {
                context.Response.ContentType = "application/json";
                context.Response.StatusCode = (int)HttpStatusCode.BadRequest;
    
                var error = new ErrorDto
                {
                    Code = context.Response.StatusCode,
                    Description = "badReq"
                };
    
                var response = JsonConvert.SerializeObject(error);
                await context.Response.WriteAsync(response);
            }
        }
}

并在我的 :Program.cs

app.UseMiddleware<ErrorHandlingMiddleware>();

我想在我的处理程序中处理几个 http 请求错误,如何做到这一点。因为如果我在发生错误的那一刻抛出一个自定义异常,它就会正常工作。如何处理多个错误(包括)?HttpStatusCode

C# asp.net .NET 异常 错误处理

评论

1赞 Kevin C 11/16/2023
您能澄清一下处理几个请求错误是什么意思吗?如果您只想处理异常,您可能还需要考虑使用以下替代方法:learn.microsoft.com/en-us/aspnet/core/fundamentals/...app.UseExceptionHandler

答:

0赞 Ali Hemmati 11/16/2023 #1

为了使用现有的 ErrorHandlingMiddleware 更好地处理 ASP.NET 7.0 应用中的各种 HTTP 请求错误,请考虑调整 catch 块以单独处理不同的异常。现在,您的中间件以相同的方式捕获和处理所有异常,这并不总是适用于不同的错误类型。

在此版本中,CustomExceptionTypeA 和 CustomExceptionTypeB 只是示例。将它们替换为与应用程序相关的实际异常类型。WriteErrorResponse 方法旨在简化错误响应的创建。

public async Task InvokeAsync(HttpContext context)
{
    try
    {
        await _next(context);
    }
    catch (CustomExceptionTypeA ex)
    {
        // Handling specific for CustomExceptionTypeA
        await WriteErrorResponse(context, HttpStatusCode.BadRequest, "Error A occurred");
    }
    catch (CustomExceptionTypeB ex)
    {
        // Handling specific for CustomExceptionTypeB
        await WriteErrorResponse(context, HttpStatusCode.InternalServerError, "Error B occurred");
    }
    catch (Exception ex)
    {
        // Handling for general exceptions
        await WriteErrorResponse(context, HttpStatusCode.InternalServerError, "General error occurred");
    }
}

private async Task WriteErrorResponse(HttpContext context, HttpStatusCode statusCode, string message)
{
    context.Response.ContentType = "application/json";
    context.Response.StatusCode = (int)statusCode;

    var error = new ErrorDto
    {
        Code = context.Response.StatusCode,
        Description = message
    };

    var response = JsonConvert.SerializeObject(error);
    await context.Response.WriteAsync(response);
}

例如:

   catch (FileNotFoundException ex)
    {
        // Handle the case when a file is not found
        await WriteErrorResponse(context, HttpStatusCode.NotFound, "File not found");
    }
    catch (UnauthorizedAccessException ex)
    {
        // Handle the case when a user is not authorized to access a resource
        await WriteErrorResponse(context, HttpStatusCode.Unauthorized, "Unauthorized access");
    }

评论

0赞 Winter Wind 11/16/2023
我尝试了你的例子,我有一个错误 404,但响应是 catch (Exception ex) { await WriteErrorResponse(context, HttpStatusCode.InternalServerError, “General error occurred”);
0赞 Ali Hemmati 11/17/2023
看起来中间件没有按应有的方式捕获 FileNotFoundException,而是默认为常规异常处理程序。有几个原因: 1-可能不会抛出正确的异常:您尝试捕获的错误实际上可能不是FileNotFoundException 2-检查中间件的顺序 3-在其他地方查找异常处理 4-路由相关问题:如果404错误是由于与任何路由不匹配的URL(如不存在的页面)引起的, 它可能不会引发 FileNotFoundException,但框架本身可能会返回 404 响应。
0赞 Ali Hemmati 11/18/2023
@WinterWind 你能把结果发给我吗?