.NET Blazor Server中UseExceptionHandler无法路由未处理异常至错误页
Blazor Server 未处理异常跳转错误页问题解决
你的问题核心在于:UseExceptionHandler 仅能捕获HTTP请求阶段的异常(比如访问不存在的路由、静态资源加载失败等),但Blazor Server组件内抛出的异常属于SignalR连接的电路(Circuit) 运行阶段,不在普通HTTP请求管道中,所以无法被它捕获。
以下是完整的解决方案:
1. 配置Blazor电路全局异常处理
在Startup.cs的ConfigureServices方法中,为ServerSideBlazor添加电路异常处理配置,用于捕获并处理组件内的未处理异常:
public void ConfigureServices(IServiceCollection services) { // 其他服务配置... services.AddServerSideBlazor() .AddCircuitOptions(options => { // 开发环境显示详细错误信息(可选) if (_env.IsDevelopment()) { options.DetailedErrors = true; } // 全局未处理异常回调 options.UnhandledExceptionHandler = exceptionContext => { // 记录异常日志 var logger = exceptionContext.Services.GetRequiredService<ILogger<Program>>(); logger.LogError(exceptionContext.Exception, "Blazor电路未处理异常"); // 标记异常已处理,避免应用崩溃 exceptionContext.Handled = true; }; }); }
2. 使用错误边界(Error Boundary)隔离局部异常
Blazor提供ErrorBoundary组件,可包裹可能抛出异常的组件区域,当区域内发生异常时,会显示自定义错误内容,而不会导致整个应用冻结:
在你的页面或组件中使用:
<ErrorBoundary ErrorContent="ErrorContent"> <!-- 可能抛出异常的内容,比如你的按钮组件 --> <button @onclick="ThrowException">触发异常</button> </ErrorBoundary> @code { private void ThrowException() { throw new Exception("测试异常"); } private RenderFragment ErrorContent => __builder => { <div class="alert alert-danger"> <p>发生了未预期的错误!</p> <!-- 可以添加跳转错误页的按钮 --> <a href="/Error" class="btn btn-primary">查看详细错误</a> </div> }; }
3. 处理SignalR连接断开后的跳转
如果严重异常导致SignalR连接断开,可在_Host.cshtml中添加JavaScript代码,监听连接断开事件并跳转到错误页:
<script> Blazor.start().then(() => { const connection = window.Blazor.defaultConnection; connection.onclose = (error) => { // 连接断开时跳转到错误页 window.location.href = "/Error"; }; }); </script>
4. 保留UseExceptionHandler处理HTTP阶段异常
你当前配置的UseExceptionHandler("/Error")仍然有效,它会处理以下场景的异常:
- 直接访问不存在的路由(HTTP 404等)
_Host.cshtml页面本身的异常- 静态资源加载异常
内容的提问来源于stack exchange,提问作者KDA
相关产品推荐
相关产品推荐

