捕获并在页面上显示 .NET Maui Blazor 项目中的任何错误
Catch and display on the page any error in a .NET Maui Blazor project
出于测试目的,我想 'catch' 我的应用程序中发生的任何错误并将其显示在页面上(而不是在控制台中)。为此,我在 .Net 6 框架中发现了 ErrorBoundary 组件。
ErrorBoundaries doc from Microsoft
起初,我在 Bazor WebAssembly 项目中成功测试了这个组件。
步骤:
- 创建一个新的 Blazor WebAssembly 项目
- 创建组件CustomErrorBoundary.razor(见下面的代码)
- 在 MainLayout.razor 中用组件 CustomErrorBoundary
包围 @Body 指令
- 在FetchData.razor代码中抛出异常(见下文)
CustomErrorBoundary
@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 项目中的任何错误并将其显示在页面上?
尝试破译错误,乍一看,您继承的 ErrorBoudary 类型似乎需要一个未注入到您的 MAUI 项目中的依赖项。
我发现一个 post 似乎可以解释您的问题 Githubmemory on this issue
基本上,您需要实现接口,然后将新 class 注册为可用服务。
我猜 Blazor Wasm 默认实现了这个?
出于测试目的,我想 'catch' 我的应用程序中发生的任何错误并将其显示在页面上(而不是在控制台中)。为此,我在 .Net 6 框架中发现了 ErrorBoundary 组件。
ErrorBoundaries doc from Microsoft
起初,我在 Bazor WebAssembly 项目中成功测试了这个组件。
步骤:
- 创建一个新的 Blazor WebAssembly 项目
- 创建组件CustomErrorBoundary.razor(见下面的代码)
- 在 MainLayout.razor 中用组件 CustomErrorBoundary 包围 @Body 指令
- 在FetchData.razor代码中抛出异常(见下文)
CustomErrorBoundary
@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 项目中的任何错误并将其显示在页面上?
尝试破译错误,乍一看,您继承的 ErrorBoudary 类型似乎需要一个未注入到您的 MAUI 项目中的依赖项。
我发现一个 post 似乎可以解释您的问题 Githubmemory on this issue 基本上,您需要实现接口,然后将新 class 注册为可用服务。
我猜 Blazor Wasm 默认实现了这个?