You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 06:55:18