集中式异常处理不起作用

时间:2019-03-24 15:01:09

标签: asp.net-core

我正在ASPNetCore应用程序中测试集中式异常处理,并希望查看是否抛出了意外异常,该异常将由app.UseExceptionHandler()中间件正确处理并记录到特定的记录目标。我断开了SQL数据库的连接,期望在DbContext类构造函数中看到Database.EnsureCreated()方法,并抛出System.Data.SqlClient.SqlException。问题是它确实抛出了这样的异常,但是它出现在本地而不是由中央化的错误处理程序处理。最终结果是,客户端永远不会收到响应消息来说明状态码500发生了什么。

enter image description here

这似乎很奇怪,因为处理程序可以正常工作,但我会在控制器内部抛出异常。

这是我的集中式异常处理程序配置:

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");

                    }

                });
            });     

有人可以告诉我我可能做错了什么吗?有人遇到过类似的问题吗?

2 个答案:

答案 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));