仅捕获 "Exception" 是否可接受?
在编程中,我们经常会遇到需要捕获异常的情况。然而,问题是我们应该捕获哪些异常呢?这个问题的答案是“取决于情况”。
首先,我们需要考虑的是在哪里捕获异常。一般来说,库应该更加保守地捕获异常,而在程序的顶层(例如在主方法或控制器的顶部的操作方法中)可以更自由地捕获异常。
之所以这样做,是因为在库中捕获所有异常可能会掩盖与库无关的问题,比如"OutOfMemoryException",我们希望这种异常能够上浮,以便通知用户等。但是,如果我们在主方法中捕获异常,然后显示并退出程序,那么在这种情况下捕获几乎任何异常都是安全的。
关于捕获所有异常,最重要的规则是不要悄悄地吞噬所有异常,比如在Java中:
try { something(); } catch (Exception ex) {}
或者在Python中:
try: something() except: pass
这样做可能会导致最难追踪的问题。
一个很好的经验法则是只捕获你可以完全处理的异常。如果你无法完全处理异常,那么应该让它上浮给能够处理的人。
在语言边界处捕获所有异常并进行转换也是一个好的实践。
"之所以这样做,是因为在库中捕获所有异常可能会掩盖与库无关的问题,比如"OutOfMemoryException" "。有趣的是,.NET框架有时实际上会捕获OutOfMemoryException。
总结起来,捕获异常的方式取决于具体情况。在库中要保守地捕获异常,以免掩盖其他问题。在程序的顶层可以更自由地捕获异常。无论在哪里捕获异常,我们都应该遵循一些原则,比如不要悄悄地吞噬所有异常,只捕获自己能够完全处理的异常。同时,在语言边界处捕获异常并进行转换也是一个好的实践。
在应用程序的前端进行一些日志记录和清理代码之外,我认为捕获所有异常是不好的。 [/apcode]
我的基本原则是捕获所有你期望的异常,其他任何异常都是一个bug。
如果你捕获所有异常并继续执行,就像在你的汽车仪表盘上贴一张创口贴一样。你看不见它了,但这并不意味着一切都没问题。
在编写代码时,我们经常需要处理异常情况。有时我们只希望捕获特定类型的异常,并进行相应的处理。然而,有时我们可能会尝试捕获所有异常,使用"Exception"来捕获所有可能的异常类型。这样做的原因是什么?以及是否可以只捕获"Exception"类型的异常?
首先,我们来看一下出现这个问题的原因。有人认为,捕获所有异常可能会掩盖真正的问题。就像在汽车仪表盘上贴一张创口贴一样,虽然警示灯不再亮起,但这并不意味着车辆没有问题。同样,捕获所有异常,尤其是没有预料到的异常,可能会掩盖潜在的错误,使问题难以发现和解决。
那么,应该如何解决这个问题呢?一种解决方法是只捕获我们预期的异常,而其他异常则被视为bug。这样做可以帮助我们更好地跟踪和调试代码,找出潜在的问题并及时修复。另一种解决方法是使用多个catch块,每个catch块分别处理不同类型的异常。这样可以根据具体的异常类型进行相应的处理,提高代码的稳定性和可靠性。
捕获所有异常可能会掩盖真正的问题,因此不建议只捕获"Exception"类型的异常。相反,我们应该根据具体情况选择捕获特定类型的异常,并采取相应的处理措施。这样可以帮助我们更好地调试和维护代码,提高代码的质量和可靠性。
以下是示例代码,演示了捕获特定类型的异常以及使用多个catch块处理不同类型异常的方法:
try {
// Some code that may throw exceptions
} catch (FileNotFoundException e) {
// Handle FileNotFoundException
} catch (IOException e) {
// Handle IOException
} catch (Exception e) {
// Handle other exceptions
}