exception-handling - 异常处理程序未在自定义中间件 (.NET Core 2.0) 中捕获整个异常
问题描述
我尝试使用中间件进行异常处理。我写了一些代码,但它不起作用。有问题。通常,如果我使用 try catch 范围,我可以捕获异常。但我无法抓住中间件。怎么了?
我在尝试范围内寻找结果实体。结果实体有一个例外,所以我尝试使用 if 条件。我解决了这个问题,但我认为这是不可接受的:)
我在业务层(洋葱架构)中抛出了一些异常,例如:throw new Exception("have a problem");
还有我在 webapi 层的中间件类。如果我发现错误,我想发送响应一些数据。
我的中间件代码在下面
public class ExceptionHandlingMiddleware
{
private readonly RequestDelegate _next;
public ExceptionHandlingMiddleware(RequestDelegate next)
{
_next = next;
}
public Task Invoke(HttpContext httpContext)
{
try
{
var result = _next(httpContext);
if (result.Exception != null)
throw result.Exception;
return result;
}
catch (Exception ex)
{
return HandleExceptionAsync(httpContext, ex);
}
}
private Task HandleExceptionAsync(HttpContext context, Exception exception)
{
var code = ResponseCode.Alliswell;
switch (exception)
{
case ServiceException _:
code = ResponseCode.ServiceError;
break;
case BusinessException _:
code = ResponseCode.BusinessError;
break;
case DataLayerException _:
code = ResponseCode.DataLayerError;
break;
case EsriServiceException _:
code = ResponseCode.EsriServiceError;
break;
}
//var result = JsonConvert.SerializeObject(new { error = ex.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
var responseEntity = new Response<object>
{
Data = null,
Code = code,
ErrorMessage = exception.Message,
State = ResponseState.Error
};
var result = context.Response.WriteAsync(JsonConvert.SerializeObject(responseEntity));
return result;
}
}
解决方案
在中间件中使用 async await 语法,以便捕获任何抛出的异常
public class ExceptionHandlingMiddleware {
private readonly RequestDelegate _next;
public ExceptionHandlingMiddleware(RequestDelegate next) {
_next = next;
}
public async Task Invoke(HttpContext httpContext) {
try {
await _next(httpContext);
} catch (Exception ex) {
await HandleExceptionAsync(httpContext, ex);
}
}
private async Task HandleExceptionAsync(HttpContext context, Exception exception) {
var code = ResponseCode.Alliswell;
switch (exception) {
case ServiceException _:
code = ResponseCode.ServiceError;
break;
case BusinessException _:
code = ResponseCode.BusinessError;
break;
case DataLayerException _:
code = ResponseCode.DataLayerError;
break;
case EsriServiceException _:
code = ResponseCode.EsriServiceError;
break;
}
//var result = JsonConvert.SerializeObject(new { error = ex.Message });
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
var responseEntity = new Response<object> {
Data = null,
Code = code,
ErrorMessage = exception.Message,
State = ResponseState.Error
};
await context.Response.WriteAsync(JsonConvert.SerializeObject(responseEntity));
}
}
推荐阅读
- c - 在ioctl linux设备驱动中读写
- c# - 通过密钥(字符串)锁定关键部分的算法中的缺陷在哪里?
- python - 在python列表中将表示时间戳的字符串转换为日期格式
- c++ - 定义/预设 NURBS 起点和终点的方向
- mongodb - express-gateway- 是否可以将响应结果保存到数据库?
- c# - SpeechResult 的 Twilio 语音识别问题
- c# - 一次杀死多个进程
- java - 比较 2 个不同用户在 Android/Firebase 中的时间戳
- unix - 如何从 kornshell 脚本调用 asp.net web api
- javascript - 将 Jquery 转换为 Javascript 尝试失败