我正在ASPNetCore应用程序中测试集中式异常处理,并希望查看是否抛出了意外异常,该异常将由app.UseExceptionHandler()中间件正确处理并记录到特定的记录目标。我断开了SQL数据库的连接,期望在DbContext类构造函数中看到Database.EnsureCreated()方法,并抛出System.Data.SqlClient.SqlException。问题是它确实抛出了这样的异常,但是它出现在本地而不是由中央化的错误处理程序处理。最终结果是,客户端永远不会收到响应消息来说明状态码500发生了什么。
这似乎很奇怪,因为处理程序可以正常工作,但我会在控制器内部抛出异常。
这是我的集中式异常处理程序配置:
app.UseExceptionHandler(appError =>
{
appError.Run(async context =>
{
var errorFeature = context.Features.Get<IExceptionHandlerFeature>();
if (errorFeature != null)
{
var exception = errorFeature.Error;
logger.LogError(exception.ToString());
await context.Response.WriteAsync("An unexpected error occurred! Try again later");
}
});
});
有人可以告诉我我可能做错了什么吗?有人遇到过类似的问题吗?
答案 0 :(得分:0)
您的代码对我来说不错。您遇到的是第一次机会异常。这意味着抛出了一个异常,最终可能会对其进行处理。在运行时,您的ExceptionHandler应该完美地处理您的异常。
但是,在调试时,Visual Studio会因该异常而中断。可以在“例外设置”([self.mySharedDefaults setValue: [NSDictionary dictionaryWithObjectsAndKeys: @"CHECKING", @"CMD",
[NSUUID UUID].UUIDString, @"UUID", nil] forKey:@"appStatusOUT"];
)中配置Visual Studio的行为。有关更多信息,请参见Microsoft Docs。
因此,您基本上要做的就是告诉Visual Studio在SqlException上继续调试
答案 1 :(得分:0)
您可以使用自己的中间件作为第一人称处理
public class ExceptionFilter: IExceptionFilter
{
public void OnException(ExceptionContext context)
{
String message = String.Empty;
Type exceptionType = context.Exception.GetType();
if (exceptionType == typeof(NotImplementedException))
{
message = "A server error occurred.";
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.NotImplemented;
context.Result = new RedirectResult("/Home/Index");
}
else if (exceptionType == typeof(AppException))
{
message = context.Exception.ToString();
context.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
context.Result = new RedirectResult("/Home/Index");
}
//HttpResponse response = context.HttpContext.Response;
//response.StatusCode = (int)status;
//context.Result = new RedirectResult("/Home/Index");
}
}
在您的Startup.cs
app.UseMiddleware(typeof(ExceptionFilter));