【问题标题】:Whole blazor web app stop working when exception occured发生异常时整个 Blazor Web 应用程序停止工作
【发布时间】:2019-06-21 02:02:05
【问题描述】:

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

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

如何处理这个问题?

感谢和问候

已编辑

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

重现步骤:

  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)

【问题讨论】:

  • 处理您的异常。总是一个好主意。我不确定,但当前的 Blazor 行为可能是设计使然。
  • 请提供代码或一些堆栈跟踪/日志。异常发生在应用程序的哪个部分?
  • 我认为这是一个很好的问题。我附加了其他信息以使其如此友好。
  • .net Core 6 将有一个可能有用的 ErrorBoundary 组件:devblogs.microsoft.com/aspnet/…

标签: blazor blazor-server-side


【解决方案1】:

2021 年 7 月编辑

幸运的是,我们现在有这方面的官方文献:Handle errors in ASP.NET Core Blazor apps

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

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

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

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

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

样本 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:

对于.razor页面上的DivideByZeroException

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

目前它们不是解决方案。

已编辑Mister Magoo 解决:示例 2 有一个解决方案:try..catch - 但对所有标记都这样做不太实际

<h1>
    @try
    {
        @:@((0 / (5 - currentCount)).ToString())
    }
    catch (Exception ex)
    {
        @:@ex.Message;
    }
</h1>

【讨论】:

  • 对于示例 2 有一个解决方案:try..catch blazorfiddle.com/s/qdjir8f4 - 但对所有标记都这样做不太实际 - 我们确实需要在 Blazor 内部实现一些更好的错误处理
  • @Mister Magoo - 很高兴看到 Blazor 团队意识到这一需求,但是,如果他们无法在下一个版本中发布任何内容,我不会感到惊讶。也许“社区”可能需要创建一个 NuGet 包来解决这个问题?
  • 嗨@csharpdudeni77,我确定了答案。 Blazor 发展得如此之快,感谢您让我知道已弃用的链接。
  • 仍在尝试解决这个问题,因为刚刚学习 blazor,因为 maui 似乎正在将它用于桌面应用程序@daniherrera
  • 我没有投反对票,除了堆栈没有办法告诉你谁投了@daniherrera
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-30
  • 2012-10-11
  • 2012-10-08
  • 1970-01-01
  • 2022-11-21
  • 2012-02-08
相关资源
最近更新 更多