【问题标题】:When writing a "try" why should we always write a "catch"? [closed]在写“尝试”时,为什么我们总是要写“捕获”? [关闭]
【发布时间】:2012-09-04 08:43:25
【问题描述】:

最近,我与一位开发人员进行了一次有趣的对话,他告诉我,每次编写“尝试”时,都必须提供“捕获”。他无法解释为什么会有这条规则。他告诉我,这是一个好的编程原则。为什么有这个规则?

为了你的信息,我不同意他的观点。我认为有时你可以编写一个只有“finally”块的“try”块。但我确实认为如果你写了一个“catch”,你必须在你的 catch 中做一些事情。永远不要只是重新抛出错误。

【问题讨论】:

  • 是的。仅当您打算处理错误时才应添加 catch 块。
  • 我同意您关于有时使用try/finally 的问题。 try/finally 在总是需要清理时很有用,但异常将在更高级别处理(或记录)。非常有用,事实上,有内置支持(在 C# 中)用于生成它们(usingIDisposable
  • catch 语句或 finally 语句在 java 和 java 脚本中的某些语言语法中是强制性的,如果您不编写它们将无法编译。主要价值是捕获不同的异常类型并执行语句失败或成功执行必须执行的操作。
  • 相关:stackoverflow.com/questions/128818/…(但根据FAQ,现在也离题了)
  • 这怎么可能“没有建设性”?这是一个基本问题,有明确且明确的答案,涉及许多语言的最基本结构之一。

标签: try-catch


【解决方案1】:

您是对的:如果您不知道如何处理异常,并且只想确保您的 finally 子句被执行,则不需要编写 catch 子句。

添加catch 子句只是为了重新抛出异常是不好的做法。

顺便说一句,为了说明catchfinally 实际上与两个不同的(当然不是外来的)问题有关,请注意某些语言使用不同的构造来捕获异常并确保某些代码(通常资源释放)被执行。以defer 为例。

【讨论】:

    【解决方案2】:

    在大多数应用程序中,try/finally 构造的数量远远多于 try/catch 构造。

    因为清理资源比接收您知道如何处理的异常更常见。

    但是,try/finally 在 C# 中几乎总是可以被 using 替换,因此在 C# 中,您的开发人员可能会在这种情况下有所帮助;但这绝对不是“良好编程的原则”。

    【讨论】:

      【解决方案3】:
      try
      {
          ...
      }
      finally
      {
          ...
      }
      

      让您有机会在 finally 块中执行代码,否则如果在 try 块中引发异常,这些代码会被遗漏。 只有在发生异常时有特定的事情要做时,才需要添加一个 catch 块。

      【讨论】:

        猜你喜欢
        • 2011-05-31
        • 2016-01-23
        • 1970-01-01
        • 1970-01-01
        • 2011-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多