2

请就以下问题向我提供任何合适的解决方案,

当 blazor 应用程序抛出任何异常时,整个应用程序都会关闭并且没有链接正在工作,直到我可以再次通过工作室运行应用程序。

这个问题怎么办?

谢谢和最好的问候

已编辑

(为了提供所要求的信息)

重现步骤:

  1. 创建一个 blazorserverside 应用程序:

  2. 修改 IncrementCount

Counter.razor

void IncrementCount()
{
    currentCount += 1;
    _ = 0 / (5-currentCount);  // <-- force error when currentCount is 5.
}
  1. 按下Click Me按钮 5 次以引发错误。

  2. 尝试导航到其他应用程序页面(主页、获取数据)没有任何反应,因为它在客户端上静默失败。

附加信息

配置Startup.cs错误时:

app.UseExceptionHandler("/errors");

堆栈跟踪错误:

Unhandled exception rendering component: Attempted to divide by zero.
System.DivideByZeroException: Attempted to divide by zero.
   at blaex.Pages.Counter.IncrementCount() in /home/dani/tmp/blaex/Pages/Counter.razor:line 27
   at Microsoft.AspNetCore.Components.EventCallbackWorkItem.InvokeAsync[T](MulticastDelegate delegate, T arg)
   at Microsoft.AspNetCore.Components.ComponentBase.Microsoft.AspNetCore.Components.IHandleEvent.HandleEventAsync(EventCallbackWorkItem callback, Object arg)
   at Microsoft.AspNetCore.Components.Rendering.Renderer.DispatchEventAsync(Int32 eventHandlerId, UIEventArgs eventArgs)
4

1 回答 1

2

2021 年 7 月编辑

幸运的是,我们现在有这方面的官方文献:处理 ASP.NET Core Blazor 应用程序中的错误

当 Blazor 应用在​​开发期间无法正常运行时,从应用接收详细的错误信息有助于进行故障排除和解决问题。发生错误时,Blazor 应用会在屏幕底部显示一个浅黄色条:

  • 在开发过程中,该栏会将您定向到浏览器控制台,您可以在其中看到异常。
  • 在生产中,该栏会通知用户发生错误并建议刷新浏览器。

此错误处理体验的 UI 是 Blazor 项目模板的一部分。

在文档中,它们是 Blazor Server 详细电路错误和全局异常处理、使用持久提供程序记录错误、可能发生错误的位置、高级方案和附加资源。

另外,我在这里写了一些关于如何捕获异常的示例:

样品 1:

对于您的代码:

void IncrementCount()
{
    currentCount += 1;
    _ = 0 / (5-currentCount);  // <-- force error when currentCount is 5.
}

解决方案是:

void IncrementCount()
{
    currentCount += 1;
    try
    {
        _ = 0 / (5-currentCount);
    }
    catch (DivideByZeroException e)
    {
        // handling exception
    }
}

样本 2:

对于DivideByZeroException页面.razor

<h1> @( (0 / (5-currentCount) ).ToString()  ) </h1>

目前它们不是解决方案。

Magoo 先生编辑的工作:示例 2 有一个解决方案:try..catch- 但对所有标记都这样做不是很实际

<h1>
    @try
    {
        @:@((0 / (5 - currentCount)).ToString())
    }
    catch (Exception ex)
    {
        @:@ex.Message;
    }
</h1>
于 2019-07-03T14:42:31.003 回答