Выявление и отображение на странице любых ошибок в проекте .NET Maui Blazor
В целях тестирования я хотел бы «поймать» любую ошибку, возникающую в моем приложении, и отобразить ее на странице (а не в консоли). Для этого я обнаружил компонент ErrorBoundary в платформе .Net 6.
Документ ErrorBoundaries от Microsoft
Сначала я успешно протестировал этот компонент в проекте Bazor WebAssembly .
Шаги:
- Создайте проект newBlazor WebAssembly
- Создайте компонент CustomErrorBoundary.razor (см. Код ниже)
- В MainLayout.razor окружите инструкцию @Body компонентом CustomErrorBoundary.
- В 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 .
Шаги:
- Создайте проект newBlazor .NET Maui Blazor
- Добавьте в проект пакет Microsoft.AspNetCore.Components.Web (чтобы воспользоваться ErrorBoundary)
- Перезапустите Visual Studio (не обязательно)
- Создайте компонент CustomErrorBoundary.razor (см. Код выше)
- В MainLayout.razor окружите инструкцию @Body компонентом CustomErrorBoundary.
- В WeatherForecastService.cs вызовите исключение в коде (см. Ниже)
К сожалению, при попытке запустить проект сразу вылетает.
Проще говоря: кажется, что ErrorBoundary не поддерживается в проекте .NET Maui Blazor.
<ErrorBoundary>
@Body
</ErrorBoundary>
Приведенный выше простой код не работает в Blazor Maui.
Итак, я не знаю , совместим ли ErrorBoundary с .NET Maui Blazor? Если нет, как отловить какие-либо ошибки внутри проекта Blazor Maui и отобразить их на странице?
3 ответа
Пытаясь расшифровать ошибку, на первый взгляд кажется, что тип ErrorBoudary, который вы наследуете, нуждается в зависимости, которая не внедряется в ваш проект MAUI.
Я нашел сообщение, которое, кажется, объясняет вашу проблему Githubmemory по этой проблеме. По сути, вам нужно реализовать интерфейс, а затем зарегистрировать этот новый класс как доступную службу.
Я предполагаю, что Blazor Wasm реализует это по умолчанию?
Я знаю, что это не ответ на это, и я надеюсь, что это не дурной тон. Я учусь прямо сейчас, я хотел поделиться соответствующим фрагментом кода на случай, если кто-то еще захочет это сделать.
используя приведенный выше пример, и Mudblazor. Я сделал пользовательский компонент границы ошибки, который отображает ошибку во всплывающем окне закусочной.
CustomErrorBoundary.razor
@inherits ErrorBoundary
@inject ISnackbar Snackbar
@if (CurrentException is null)
{
@ChildContent
}
else if (ErrorContent is not null)
{
@ErrorContent(CurrentException)
}
else
{
@ChildContent
@foreach (var exception in receivedExceptions)
{
Snackbar.Add(@exception.Message, Severity.Error);
}
Recover();
}
@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();
}
}
MainLayout.razor
@inherits LayoutComponentBase
@inject ISnackbar Snackbar
<MudThemeProvider IsDarkMode="true"/>
<MudDialogProvider />
<MudSnackbarProvider />
<MudLayout>
<MudAppBar>
<MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" Edge="Edge.Start" OnClick="@((e) => DrawerToggle())" />
</MudAppBar>
<MudDrawer @bind-Open="@_drawerOpen">
<NavMenu/>
</MudDrawer>
<MudMainContent>
<CustomErrorBoundary>
@Body
</CustomErrorBoundary>
</MudMainContent>
</MudLayout>
@code {
bool _drawerOpen = true;
private void DrawerToggle()
{
_drawerOpen = !_drawerOpen;
}
}
Я обсуждаю, работает ли мой ответ только из-за MudBlazor или нет, но, поскольку здесь мало отзывов, я просто добавлю его. Я использую ErrorBoundary по умолчанию, и он отлично работает для меня. Может что-то обновилось за последние 9 месяцев?
Вот мой соответствующий код в MainLayout.razor:
<MudLayout>
<MudAppBar Elevation="0">
@* Some random MudAppBar stuff... *@
</MudAppBar>
<MudMainContent>
<MudContainer MaxWidth="MaxWidth.Large" Class="my-16 pt-16">
<ErrorBoundary>
<ChildContent>
@Body
</ChildContent>
<ErrorContent>
<p class="errorUI">An error has occured. Edit this content in MainLayout.razor</p>
</ErrorContent>
</ErrorBoundary>
</MudContainer>
</MudMainContent>
</MudLayout>
Я выбрасываю исключение так же, как в вопросе, и появляется содержимое ошибки :)