我尝试使用中间件进行异常处理。我写了一些代码,但是没有用。有问题。通常,如果使用try catch范围,则可以捕获异常。但是我无法掌握中间件。怎么了?
我在try范围中寻找结果实体。结果实体存在异常,因此我尝试使用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;
}
}
答案 0 :(得分:1)
在中间件中使用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));
}
}