我有一個在我的應用程式的特定背景關系中生成的例外。我希望能夠收集它,將其發送到記錄器并恢復以前的狀態。

問題是無法訪問此錯誤系結例外,因為它當前的例外屬性受到保護。

解決方案是什么?
uj5u.com熱心網友回復:
我希望能夠收集它并將其發送到記錄器并恢復以前的狀態。
創建如下組件(Error.razor):
@using Microsoft.Extensions.Logging
@inject ILogger<Error> Logger
@inject IJSRuntime jsRuntime
<CascadingValue Value="this">
@ChildContent
</CascadingValue>
@code {
[Parameter]
public RenderFragment? ChildContent { get; set; }
public void ProcessError(Exception ex)
{
Logger.LogError("Error:ProcessError - Type: {Type} Message: {Message}",
ex.GetType(), ex.Message);
jsRuntime.ToastrError("An Error has occured!");
//StateHasChanged();
}
}
Error組件可以使用 Blazor 內置記錄器記錄錯誤,并通過該方法使用Toastr顯示 JavaScript 錯誤訊息。ProcessError顯然,可以使用其他記錄器,例如 Serilog、Elmah 甚至其他自定義記錄器來登錄此方法。
StateHasChanged當錯誤處理方法想要直接干預發生例外的組件的用戶界面的渲染時會使用。例如,當我們想在出錯后更改頁面的渲染元素時(更改按鈕的顏色或標簽或文本框的字體顏色或......)。
現在,我們編輯App.razor組件如下:
<Error>
<Router ...>
...
</Router>
</Error>
事實上,我們用自己的自定義組件(Error.razor)封裝了Router組件,這樣Error組件就級聯到任何將Error視為.的程式組件[CascadingParameter]。
現在,在其他組件中處理如下錯誤就足夠了:
@code {
[CascadingParameter]
public Error? Error { get; set; }
private void CreatePost()
{
try
{
throw new InvalidOperationException("a message!");
}
catch (Exception ex)
{
Error?.ProcessError(ex);
}
}
}
可以看到,Error 組件被定義為CascadingParameter一個 try catch 塊,ProcessError呼叫 Error 組件的方法并將發出的例外發送給它。在我的示例中,Error 組件只有一種錯誤處理方法。顯然,這個組件可以有幾個其他的自定義錯誤處理方法用于不同的目的。
要將日志保存在服務器上的文本檔案中,您可以使用 Serilog,其方法在此處說明。您還可以使用自定義日志提供程式將日志保存到資料庫。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/521045.html
上一篇:有沒有辦法在沒有trycatch塊的情況下處理例外?
下一篇:全域例外忽略且不起作用
