When writing a “try” why should we always write a “catch”?
最近,我和一位开发人员同事进行了一次有趣的交谈,他告诉我,每次写"尝试"时,都必须提供"捕获"。他无法解释这条规则的原因。他告诉我这是一个好编程的原则。为什么会这样呢?
据你所知,我不同意他的说法。我认为有时候你可以用一个"finally"块来写一个"try"块。但我认为,如果你写了一个"catch",你就必须在catch中做些什么。千万不要只重复错误。
- 对。只有当您打算处理错误时,才应该添加catch块。
- 我同意你关于有时使用try/finally的问题。当总是需要清理时,try/finally是有用的,但异常将在更高的级别处理(或记录)。实际上,它非常有用,以至于有内置的支持(在C中)来生成它们(using和IDisposable)
- 在Java和Java脚本中的某些语言语法中,catch语句或最后语句是强制性的,如果不编写它们,它就不会编译。主要值是捕获不同的异常类型,并执行语句失败或成功执行时必须执行的操作。
- 我不同意你的同事,C的创建者安德斯·赫杰斯伯格也不同意我的观点。请看下面的采访引用:>在一份写得很好的申请中,我认为"最终尝试捕捉"的比例是10:1。或者在C中,使用语句,就像try finally
- 相关:stackoverflow.com/questions/128818/…(但根据常见问题解答,现在也不再讨论)
- 当然,需要catch或finally…一个或另一个。OP询问是否总是需要catch,不管finally是否存在。
- 不-您可能希望有始终运行的清理代码,然后在堆栈中给出错误气泡。
- 这怎么可能是"不建设性的"?这是一个基本的问题,有明确和不含糊的答案,关于许多语言最基本的结构之一。
你说得对:如果你不知道如何处理例外情况,只想确保你的finally条款得到执行,你就不需要写一个catch条款。
添加catch条款只是为了重新引发异常,这是不好的做法。
顺便说一下,为了说明catch和finally实际上与两个不同的(公认不是外来的)问题有关,请注意,有些语言使用不同的构造来捕获异常,并确保执行某些代码(通常是资源释放)。例如,使用defer。
在大多数应用中,try/finally构造的数量远远超过try/catch构造的数量。
因为拥有要清理的资源比接收您知道如何处理的异常更常见。
然而,try/finally几乎总是可以被using在C中所取代,因此在C中,您的开发人员在这种情况下可能有一个观点;但最明显的是,它不是"良好编程的原则"。
1 2 3 4 5 6 7 8
| try
{
...
}
finally
{
...
} |
为您提供在finally块中执行代码的机会,否则,如果在try块中引发异常,代码将丢失。只有在发生异常时有特定的事情要做时,才需要添加catch块。