为什么捕获RuntimeException并不是一种好的编程习惯?
问题内容:
为什么捕获RuntimeException
使用catch(Throwable exc) {}
不被视为良好的编程习惯?什么是处理RuntimeException的正确方法?
另外,为什么不catch(Exception exc) {}
赶上RuntimeException
?如何执行此行为?
问题答案:
通常,a RuntimeException
表示编程错误(在这种情况下,您无法“处理”该错误,因为如果您知道期望发生错误,则可以避免该错误)。
捕获任何这些常规异常(包括Throwable
)都是一个坏主意,因为这意味着您声称自己了解所有可能出错的情况,尽管如此,您仍然可以继续。有时Exception
(而不是通常Throwable
)捕获堆栈的顶层是适当的,例如在Web服务器中-
因为通常 _单个_请求出了什么问题,您通常希望保持服务器正常运行并响应其他请求。我通常不会捕获Throwable
,因为其中包括Error
通常用于指示真正灾难性错误的子类,通常最好通过终止过程来“处理”这些错误。
从根本上讲,当出现错误时,您需要对继续执行特定任务非常谨慎-您需要对错误的含义有一个非常好的了解,否则您可能会对世界状况做出错误的假设,并使情况变得更糟。在
_大多数_情况下(并非全部),简单地放弃请求要比尝试继续进行下去要好,而不管发生什么神秘的失败。(尽管它确实很大程度上取决于上下文,例如,您可能不关心尝试获取一条辅助信息时出了什么问题。)
至于抓Exception
不抓RuntimeException
-那是不正确的。唯一奇怪的RuntimeException
是,它(和子类)是未经检查的异常,而的Exception
所有其他子类Exception
都经过检查。