还有什么地方可以捕获异常吗?

Is there anywhere else to catch exceptions?

提问人:David Thielen 提问时间:8/4/2023 更新时间:8/7/2023 访问量:62

问:

在我的 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>&copy; 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>
.NET ASP.net-Core 异常 blazor-server-side

评论

0赞 Md Farid Uddin Kiron 8/4/2023
嗯,是的,使用错误边界,您可以全局捕获所有错误。 当在整个应用程序中引发任何未经处理的异常时,将呈现错误 UI。但是,您也可以在program.cs文件中使用问题详细信息中间件。Error boundaries
0赞 David Thielen 8/5/2023
@MdFaridUddinKiron谢谢。你能把这个写成一个答案吗,我会选择它。我建议在答案中保持简单。阅读该链接,您可能会非常喜欢使用它,但对于像我这样的大多数开发人员来说,我们最初需要的只是写入日志并通知用户的异常。希望这种情况很少发生,这就是我们所需要的。短暂性投资安全
0赞 Md Farid Uddin Kiron 8/7/2023
非常感谢您的反馈,我试图根据您的解释进行解释。再次感谢。
0赞 Enigmativity 8/7/2023
我会删除您拥有的几乎所有 / 代码,除非您知道您可以有意义地处理特定异常。首先,您应该编写代码以避免异常。例外情况应适用于特殊情况,而不是标准的编程方式。您应该阅读 Eric Lippert 关于四种例外类型的博客: ericlippert.com/2008/09/10/vexing-exceptionstrycatch
0赞 David Thielen 8/7/2023
@Enigmativity 大多数情况下,我会记录异常,然后调用 在某些情况下,我可以对它们采取行动。throw;

答:

0赞 Md Farid Uddin Kiron 8/7/2023 #1

好吧,除了错误边界之外,您还可以使用问题详细信息扩展方法,该方法将绑定所有HTTP客户端和服务器错误的响应。实际实现 IProblemDetailsService 的问题详细信息,这有助于将错误保留在核心应用 asp.net。这种扩展方法在实现方面非常简单。您可以简单地包含以下行:

builder.Services.AddProblemDetails();

注意:由于存在安全风险,Microsoft 不建议公开开发环境以外的错误详细信息。

enter image description here

可定制:

Problme 细节扩展方法是一个自动错误编写器,可以使用 CustomizeProblemDetails 自定义响应,您的修改可以应用于所有自动生成的问题细节。您可以执行以下操作:

builder.Services.AddProblemDetails(options =>
    options.CustomizeProblemDetails = ctx =>
            ctx.ProblemDetails.Extensions.Add("nodeId", Environment.MachineName));

此外,是一个包含 的类型,因此可以在此处传递任何其他信息。ProblemDetails.ExtensionsIDictionaryIDictionary<string, object?>

enter image description here

注意:请注意,在使用自定义 IProblemDetailsWriter 时,必须先注册自定义 IProblemDetailsWriter,然后才能调用 AddRazorPages、AddControllers、AddControllersWithViews 或 AddMvc。详情请参阅此官方文档。