我有一个 Blazor 和 .NET 8 Web 应用程序,它使用交互式服务器模式来呈现其页面。
是否可以添加一个全局处理程序,在显示默认的黄色“发生错误。重新加载”错误消息之前捕获未处理的异常?
我确实相信我可以通过 ErrorBoundary 实现这一目标,但为了灵活性,我还被要求调查并考虑其他选项。
我研究了中间件,尝试了下面的代码(取自UseExceptionHandler Blazor 服务器端不工作),但它不起作用。我希望这与链接问题中给出的原因相同。
如果 ErrorBoundary(或从 ErrorBoundary 派生)是捕获由于 ISR 中的用户操作而引发的all未处理异常的唯一方法,请明确说明。
这是我的中间件处理程序。
public class ExceptionHandlingMiddleware
{
private readonly RequestDelegate _next;
private string _path;
private readonly ILogger<ExceptionHandlingMiddleware> _logger;
public ExceptionHandlingMiddleware(ILogger<ExceptionHandlingMiddleware> logger, RequestDelegate next, string path)
{
_next = next;
_path = path;
_logger = logger;
}
public async Task InvokeAsync(HttpContext context)
{
try
{
await _next(context);
}
catch (System.Exception ex)
{
_logger.LogError(ex, "Failed to invoke {Message}", ex.Message);
context.Response.Redirect(_path);
}
}
}
在我看来,
ErrorBoundary
组件是捕获 Blazor 组件中未处理异常的推荐方法。正如您所注意到的,中间件代码不会捕获组件渲染期间引发的异常,因为这些异常发生在 HTTP 请求管道之外,而中间件旨在处理该管道。
ErrorBoundary
是为 Blazor 的组件模型设计的,允许您通过显示自定义错误 UI 而不是默认的黄色错误消息来处理错误。这将帮助您提供用户友好的应用程序,即使发生意外错误也是如此。通过使用 ErrorBoundary
,您可以自定义错误 UI 以匹配您的应用程序的设计,甚至可以在呈现错误消息之前记录错误或执行其他操作。
虽然还有其他方法,例如在
Program.cs
中进行全局异常处理或使用 CircuitHandler
,但这些对于在组件渲染期间捕获异常并不有效。更适合处理更广泛的应用级事件。
更多详细信息,您可以参考Blazor中的错误处理的官方文档。