在决定是否要添加throws
子句或使用try-catch
时,有哪些一般性的经验法则呢?
从我自己所读的内容来看,在调用者违反了其端的合约(传递对象)时应使用throws
,而在方法内部执行过程中发生异常时应使用try-catch
。这样做正确吗?如果是这样的话,那么调用方应该怎么做?
P.S: 在Google和SO上搜索过,但希望能得到一个清晰的答案。
在决定是否要添加throws
子句或使用try-catch
时,有哪些一般性的经验法则呢?
从我自己所读的内容来看,在调用者违反了其端的合约(传递对象)时应使用throws
,而在方法内部执行过程中发生异常时应使用try-catch
。这样做正确吗?如果是这样的话,那么调用方应该怎么做?
P.S: 在Google和SO上搜索过,但希望能得到一个清晰的答案。
IOExceptions
。对于无效输入也同样适用,但在这种情况下,我个人的选择是抛出未经检查的异常,例如IllegalArgumentException
。DAO
使用Hibernate
来持久化我的实体,因此我在本地捕获所有HibernateExceptions
并将它们转换为我的自定义异常类型)。以下是我使用的方法:
Throws:
Try-Catch:
我知道很多人总是使用Throws,因为它更简洁,但是它的控制力就没有Try-Catch强。
我的个人经验法则很简单:
try/catch
中。通过处理它,我指的是能够通知用户/从错误中恢复或在更广泛的意义上理解此异常如何影响我的代码执行。注意:此回复现在是社区维基,请随意添加更多信息。
如果抛出异常的方法具有足够的信息来处理它,则应该捕获异常,生成有用的信息,说明发生了什么以及正在处理哪些数据。
我会为您简化一下。 当您认为被调用的方法不负责异常(例如,来自调用者方法的无效参数、要搜索的项、未在集合中可用或获取数据列表)时,请使用throws。 当您认为被调用方法中的功能可能导致某些异常时,请使用try catch块(在被调用方法中处理异常)。
LookAtSky()
的方法被声明为调用 FullMoonException
,并且在月亮全盈时预计会抛出它;进一步假设 LookAtSky()
调用了同样声明为 throws FullMoonException
的 ExamineJupiter()
。如果由 ExamineJupiter()
抛出了一个 FullMoonException
,并且如果 LookAtSky()
没有捕获它并处理或将其包装在其他异常类型中,调用 LookAtSky()
的代码将认为异常是由地球上的月亮充满造成的;它不会知道木星的卫星可能是罪魁祸首。
如果调用者可能期望处理的异常(包括基本上所有受检异常),只有当异常对于方法的调用者意义与被调用方法相同时,才应该允许其通过方法向上传播。如果代码调用了声明为抛出某些已检查异常的方法,但是调用者实际上不希望它抛出该异常(例如因为它认为已经预先验证了方法参数),则应该捕获并将受检异常包装在某个未经检查的异常类型中。如果调用者不希望抛出异常,则调用者不能期望它具有任何特定含义。
何时使用什么。我搜索了很多关于这个的信息。 没有硬性规定。
“但是作为开发人员,必须在方法的throws子句中包含Checked异常。这对于编译器知道要检查哪些异常是必要的。
按照惯例,不应在throws子句中包含Unchecked异常。
将它们包括在内被认为是一种糟糕的编程实践。编译器将其视为注释,并且不会对其进行检查。”
来源:Kathy Sierra的SCJP 6书籍
如果您使用try catch,当异常发生时,剩余的代码仍将被执行。
如果您指示方法抛出异常,则当异常发生时,代码将立即停止执行。