投掷或尝试捕获

Jam*_* P. 71 java exception-handling exception try-catch throws

在决定是否向方法添加throws子句或使用try-catch?时,一般的经验法则是什么?

从我自己阅读的内容来看,throws应该在调用者违反合同结束时使用(传递对象),并且try-catch在方法内执行操作期间发生异常时应该使用.它是否正确?如果是这样,应该在呼叫者方面做些什么?

PS:通过谷歌和搜索引擎优化搜索,但希望得到一个明确的答案.

Boz*_*zho 53

  • 只有在你能以有意义的方式处理它时才能捕获异常
  • 如果要由当前方法的使用者处理,则声明向上抛出异常
  • 如果它们是由输入参数引起的,则抛出异常(但这些异常通常是未选中的)

  • 为什么要重新抛出异常?只是不要抓住它并将其传递给调用堆栈. (3认同)

Pét*_*rök 14

通常,当一个方法无法在本地处理相关问题时,它应该向其调用者抛出异常.例如,如果该方法应该从具有给定路径的文件中读取,IOExceptions则不能以合理的方式在本地处理.同样适用于无效输入,并补充说我个人的选择是抛出一个未经检查的异常,就像IllegalArgumentException在这种情况下一样.

如果出现以下情况,它应该从被调用的方法中捕获异常:

  • 它是可以在本地处理的东西(例如,尝试将输入字符串转换为数字,如果转换失败,则返回默认值完全有效),
  • 或者它不应该被抛出(例如,如果异常是从具体实现的下层,其实施细则应该是不可见的呼叫者未来-比如我不想证明我DAO使用Hibernate了我坚持的实体,所以我HibernateExceptions在本地捕获所有并将它们转换为我自己的异常类型).


Rid*_*del 9

我个人的经验法则很简单:

  • 我能以一种有意义的方式处理它(从评论中添加)吗?所以把代码放进去try/catch.通过处理它,我的意思是能够通知用户/从错误中恢复,或者从更广泛的意义上说,能够理解这个异常如何影响我的代码的执行.
  • 在其他地方,扔掉它

注意:此回复现在是社区维基,随时可以添加更多信息.

  • 我能以有意义的方式处理它*. (6认同)
  • 您决定是否可以在本地处理异常的标准是什么?这是否在您可以实际处理异常并显示消息的级别? (2认同)

Jus*_*yer 8

这是我使用它的方式:

抛出:

  • 您只希望代码在发生错误时停止.
  • 如果不满足某些先决条件,那么容易出错的方法很好.

试着抓:

  • 当您希望程序以不同的错误表现不同时.
  • 如果您想为最终用户提供有意义的错误,那就太棒了 .

我知道很多人总是使用投掷,因为它更干净,但是没有那么多控制.

  • 还有Try-catch-rethrow或try-catch-wrap-throw - 也就是说,只是因为你能以一种有意义的方式处理异常并不意味着你已经完成了.该方法应该执行其名称表明它将执行的操作,或者应该抛出异常:http://abstractions-r-us.blogspot.com/2010/06/do-your-work-or-throw-exception-example. HTML.(我博客的无耻插件) (2认同)