提问人:David Thielen 提问时间:8/4/2023 更新时间:8/7/2023 访问量:62
还有什么地方可以捕获异常吗?
Is there anywhere else to catch exceptions?
问:
在我的 Blazor(服务器)应用中,我在框架调用的几乎每个方法中都有一个 try/catch。如果方法是否说将布尔设置为 true(OnChanged 方法),我不会,而是其他所有方法。
我还拥有 MainLayout.razor 中的所有内容(见下文)。
这是否意味着我会以任何方式在任何地方捕获任何异常?或者我需要做其他事情来捕获另一组异常?<ErrorBoundary>
<ErrorBoundary>
<ChildContent>
<div style="height: 100%; overflow-y: hidden;">
<div style="margin: 0; height: 100%; overflow-y: hidden;">
<div style="display: flex; flex-direction: column; height: 100%; overflow-y: hidden;">
<div style="width: 100%;">
<header>
<Banner ShowBanner="@SessionData.ShowWelcomeBanner"
OnBannerClosed="WelcomeBannerClosed"
BannerContent="Please complete your registration. <a href='/Account/Welcome'>Click here for more information.</a>" />
</header>
</div>
<div style="width: 100%;">
<NavMenu />
</div>
<div style="flex-grow: 1; width: 100%; overflow: auto;">
<div style="height: 100%; overflow: auto;">
<main>
<div class="my-main-scrollbar">
<PopupMessageBox>
@Body
</PopupMessageBox>
</div>
</main>
</div>
</div>
<div style="width: 100%;">
<footer class="main-footer">
<span>© David Thielen 2023 - ALL RIGHTS RESERVED</span>
</footer>
</div>
</div>
</div>
</div>
</ChildContent>
<ErrorContent Context="error">
@{
var guid = Guid.NewGuid().ToString();
var useFallback = true;
if (error.Data.Contains("Category"))
{
var data = error.Data["Category"];
if (data is Type category)
{
var logger = LoggerFactory.CreateLogger(category);
logger.LogError(error, "Error: {guid}", guid);
useFallback = false;
}
}
if (useFallback)
{
Logger.LogError(error, "Error: {guid}", guid);
}
}
<h1>Unexpected Error (sorry)</h1>
<p>
The program has encountered an unexpected error (yes there are expected errors). This error has been
logged and we will look at it.
</p>
<p>We suggest you <a href="/identity/account/LogOut">logout</a> and then log back in if you wish to try again.</p>
<p>If you want to contact us, please include the following error id: @guid when you do.</p>
</ErrorContent>
</ErrorBoundary>
答:
好吧,除了错误边界之外,您还可以使用问题详细信息扩展方法,该方法将绑定所有HTTP客户端和服务器错误的响应。实际实现 IProblemDetailsService 的问题详细信息,这有助于将错误保留在核心应用 asp.net。这种扩展方法在实现方面非常简单。您可以简单地包含以下行:
builder.Services.AddProblemDetails();
注意:由于存在安全风险,Microsoft 不建议公开开发环境以外的错误详细信息。
可定制:
Problme 细节扩展方法是一个自动错误编写器,可以使用 CustomizeProblemDetails 自定义响应,您的修改可以应用于所有自动生成的问题细节。您可以执行以下操作:
builder.Services.AddProblemDetails(options =>
options.CustomizeProblemDetails = ctx =>
ctx.ProblemDetails.Extensions.Add("nodeId", Environment.MachineName));
此外,是一个包含 的类型,因此可以在此处传递任何其他信息。ProblemDetails.Extensions
IDictionary
IDictionary<string, object?>
注意:请注意,在使用自定义 IProblemDetailsWriter 时,必须先注册自定义 IProblemDetailsWriter,然后才能调用 AddRazorPages、AddControllers、AddControllersWithViews 或 AddMvc。详情请参阅此官方文档。
上一个:如何控制异常弹出行为?
评论
错误
。 当在整个应用程序中引发任何未经处理的异常时,将呈现错误 UI。但是,您也可以在program.cs文件中使用问题详细信息
中间件。Error boundaries
try
catch
throw;