3

出于测试目的,我想“捕获”我的应用程序中发生的任何错误并将其显示在页面上(而不是在控制台中)。为此,我在 .Net 6 框架中发现了ErrorBoundary组件。

Microsoft 的 ErrorBoundaries 文档

起初,我在Bazor WebAssembly项目中成功测试了这个组件。

脚步:

  • 创建一个新的 Blazor WebAssembly 项目
  • 创建组件 CustomErrorBoundary.razor(参见下面的代码)
  • 在 MainLayout.razor 中,用组件 CustomErrorBoundary 包围 @Body 指令
  • 在 FetchData.razor 中抛出异常代码(见下文)

自定义错误边界

    @inherits ErrorBoundary
    @if (CurrentException is null)
    {
        @ChildContent
    }
    else if (ErrorContent is not null)
    {
        @ErrorContent(CurrentException)
    }
    else
    {
        <div style="background-color: yellow; border: 2px dashed black; white-space: pre; font-family: consolas, monospace;">
            @foreach (var exception in receivedExceptions)
            {
                <div class="received-exception" style="background-color: rgba(255,255,255,0.3); margin: 0.5rem; padding: 0.5rem;">
                    @exception.Message
                </div>
            }
        </div>
    }

    @code {
        List<Exception> receivedExceptions = new();

        protected override Task OnErrorAsync(Exception exception)
        {
            receivedExceptions.Add(exception);
            return base.OnErrorAsync(exception);
        }

        public new void Recover()
        {
            receivedExceptions.Clear();
            base.Recover();
        }
    }

在此处输入图像描述

在此处输入图像描述

在测试此应用程序并在 FetchData 中导航时,会抛出错误并显示在页面上。

在此处输入图像描述

到现在为止还挺好。现在我想做同样的事情,但这次是针对.NET Maui Blazor项目。

脚步:

  • 创建一个新的 Blazor .NET Maui Blazor 项目
  • 将包 Microsoft.AspNetCore.Components.Web 添加到项目中(以从 ErrorBoundary 中受益)
  • 重新启动 Visual Studio(非强制)
  • 创建组件 CustomErrorBoundary.razor(参见上面的代码)
  • 在 MainLayout.razor 中,用组件 CustomErrorBoundary 包围 @Body 指令
  • 在 WeatherForecastService.cs 中抛出异常的代码(见下文)

在此处输入图像描述

不幸的是,该项目在尝试启动时立即崩溃。

在此处输入图像描述

所以说得更简单:.NET Maui Blazor 项目似乎不支持 ErrorBoundary。

<ErrorBoundary>
    @Body
</ErrorBoundary>

上面的简单代码在 Blazor Maui 中不起作用。

所以我不知道ErrorBoundary是否与 .NET Maui Blazor 兼容?如果没有,如何捕获 Blazor Maui 项目中的任何错误并将其显示在页面上?

4

1 回答 1

2

试图破译错误,乍一看,您继承的 ErrorBoudary 类型似乎需要一个未注入到您的 MAUI 项目中的依赖项。

我找到了一篇似乎可以解释你的问题Githubmemory 关于这个问题的帖子 基本上,你需要实现接口,然后将该新类注册为可用服务。

错误边界代码

IErrorBoundaryLogger 的代码

我猜 Blazor Wasm 默认实现了这个?

于 2021-12-07T14:13:19.423 回答