gpt4 book ai didi

c# - "Only catch exceptions you can handle"到底是什么意思?

转载 作者:可可西里 更新时间:2023-11-01 08:21:08 27 4
gpt4 key购买 nike

我的任务是为我正在处理的 .NET/C# 项目编写异常处理策略和指南文档。我很难做到。关于如何/何时抛出、捕获、包装异常,有很多可用的信息,但我正在寻找描述除了包装和抛出异常之外的 catch block 内应该进行哪些类型的事情。

try
{
DoSomethingNotNice();
}
catch (ExceptionICanHandle ex)
{
//Looking for examples of what people are doing in catch blocks
//other than throw or wrapping the exception, and throwing.
}

提前致谢

最佳答案

就是这个意思。如果您期望您正在运行的代码抛出异常,并且当该异常被抛出时您的代码知道出了什么问题以及如何继续,然后捕获异常并处理它。

基本上,规则的存在是为了防止像这样的反模式:

try
{
...
}
catch(Exception ex)
{
throw;
}

这里的 catch 只是为展开调用堆栈添加了一个减速带。如果你实际上不想做任何你正在捕获的异常,你甚至不应该为捕获而烦恼。

一个相关但更有效的案例是您不关心抛出的异常,但您需要在所有情况下进行清理。在那种情况下,跳过捕获;您不需要它,只需将其设为 try-finally block 即可。

编辑:要回答帖子中的问题,而不仅仅是主题,您可以编写如下规则:“不要编写不执行任何操作或仅重新抛出捕获的异常的 try-catch 语句。所有捕获语句应该执行一些与抛出的异常相关的增值操作。”

例如,假设您尝试使用用户在登录您的应用程序时提供的凭据连接到 SQL Server 实例。很多事情都可能出错,有些是您无法预料到的,有些是您应该预料到的。

  • 服务器没有响应——您可以再试一次;或许在 catch 中递归调用连接方法,使用“重试计数器”来打破无限循环。
  • 用户身份验证失败 - 在对话框中以红色显示友好(或不太友好,但简洁易懂)的消息。
  • 用户无权连接到指定的数据库 - 取决于您的安全设置;在大多数办公室,这是您应该通过电子邮件向 DBA 说明的事情,因为这意味着他创建了登录名但忘记分配适当的权限。
  • 网络不可用:您可以通过登录对话框或新对话框中的错误提醒用户,重试几次等。
  • 除以零 - WTF?什么可能导致登录期间除以零?你没有预料到这个异常,你不知道在这种情况下出了什么问题,因此无法继续运行代码,所以不要捕获它。
  • 如果出现任何问题,出于审计/安全目的,您可能希望将消息记录到文件或共享资源中。如果您想继续执行,这应该在较低级别发生,如果您之后要正常关闭,则应该在较高级别发生。

所有这些示例都涉及首先捕获已知类型的异常并询问它以查看到底出了什么问题,然后执行一些可以让程序继续执行的已知操作。目的是防止应用程序在出现您知道可能出错但知道如何在这种情况下保持程序运行的错误时崩溃和燃烧。

捕获异常的基本规则:

  1. 如果您不希望出现异常,请不要捕获。
  2. 如果您不能或不想在收到异常后继续执行代码,无论您是否知道它会发生,都不要捕获它。
  3. 如果您预计异常会发生,并且知道如何在异常发生时继续执行代码(至少一段时间),那么请捕获并执行您需要的任何特殊操作以实现这一点。
  4. 从不捕获异常(一个空的 catch block );这会导致应用程序以更不可预测的方式无声地失败。
  5. 永远不要在生产代码中留下 catch-and-rethrow(一个只有 rethrow 的 catch block )。它们有时在调试时很有用,因为它们允许您识别失败的特定代码段,但在生产代码中,它们只是抛出或实际处理异常的减速带。

关于c# - "Only catch exceptions you can handle"到底是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4673860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com