提问人:Winter Wind 提问时间:11/16/2023 最后编辑:marc_sWinter Wind 更新时间:11/16/2023 访问量:65
为什么我的错误处理程序在 asp net 中不起作用?
Why does my error handler doesn't work in asp net?
问:
我在 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
答:
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 你能把结果发给我吗?
评论
app.UseExceptionHandler