ASP.NET Core Razor - 全局异常处理程序

3

我有以下代码,在.cshtml.cs文件中部分可用,但在.cshtml文件中不可用:

我需要更改我的GlobalExceptionFilter还是需要添加其他内容以捕获.cshtml的错误?

对于这两种错误,它们都会重定向到/ Error页面。

public class GlobalExceptionFilter : IExceptionFilter
{       
    public void OnException(ExceptionContext context)
    {
        LogError(context.Exception);
    }
}

Startup.cs文件中:
public void ConfigureServices(IServiceCollection services)
{
    services.AddMvcOptions(options =>
                {
                    options.Filters.Add<GlobalExceptionFilter>();
                });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }
}

Index.cshtml.cs 中:
public void OnGet()
{
    throw new Exception("Test"); //This hits GlobalExceptionFilter
}

Index.cshtml 文件中:
@{
    throw new Exception("Test"); //This does NOT hit GlobalExceptionFilter
}

提前感谢您。

1个回答

3

异常过滤器可对在响应正文写入之前发生的未处理异常应用全局策略。

异常过滤器:

适用于捕获操作中发生的异常。

不如错误处理中间件灵活。

您可以从文档中了解更多信息。

在此,您可以使用自定义ExceptionHandler中间件,如下所示:

public class CustomExceptionHandler
{
    private readonly IWebHostEnvironment _environment;
    
    public CustomExceptionHandler(IWebHostEnvironment environment)
    {
        _environment = environment;
    }

    public async Task Invoke(HttpContext httpContext)
    {
            var feature = httpContext.Features.Get<Microsoft.AspNetCore.Diagnostics.IExceptionHandlerFeature>();
            var error = feature?.Error;

            if(error != null)
            {                    
                LogError(error);
                throw error;
            }

            await Task.CompletedTask;
    }
}

将其用于startup.cs文件中。

app.UseExceptionHandler(new ExceptionHandlerOptions
{
    ExceptionHandler = new CustomExceptionHandler(env).Invoke
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接