投球或接球

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

根据我自己的阅读,throws应该在调用者违反了他们的协议(传递的对象)时使用,而 try-catch应该在方法内部执行的操作中发生异常时使用。是这样吗?如果是这样,在来电方应该做些什么?

附注: 通过谷歌搜索和所以,但想要一个明确的答案对这一个。

68230 次浏览

一般来说,当方法无法在本地处理相关问题时,应该向其调用方抛出异常。例如,如果该方法应该从一个具有给定路径的文件中读取,那么 IOExceptions就不能以合理的方式在本地进行处理。对于无效输入也是如此,并补充说我个人的选择是抛出一个未检查的异常,比如本例中的 IllegalArgumentException

并且它应该从调用的方法中捕获一个异常,如果:

  • 它可以在本地进行处理(例如,尝试将输入字符串转换为数字,如果转换失败,则完全可以返回一个默认值) ,
  • 或者它不应该被抛出(例如,如果异常来自特定于实现的下层,其实现细节不应该对调用者可见,例如,我不想显示我的 DAO使用 Hibernate来保存我的实体,所以我在本地捕获所有的 HibernateExceptions并将它们转换成我自己的异常类型)。
  • 只有在能够以有意义的方式处理异常的情况下才能捕获异常
  • 如果异常要由当前方法的使用者处理,则声明向上抛出该异常
  • 如果异常是由输入参数引起的,则抛出异常(但是这些参数通常未经检查)

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

  • 我可以处理它 以一种有意义的方式(从评论添加) ?在 try/catch中输入代码。通过处理它,我的意思是能够通知用户/从错误中恢复,或者,在更广泛的意义上,能够理解这个异常如何影响我的代码的执行。
  • 扔到别处去

注意: 此回复现在是一个社区维基,随时添加更多的信息。

如果引发异常的方法具有足够的信息量来处理异常,那么它应该捕获并生成关于发生了什么以及正在处理什么数据的有用信息。

我是这么用的:

投掷:

  • 你只是想让代码停止 出现错误。
  • 善于使用容易 如果某些先决条件是 没见过。

Try-Catch: 尝试-捕捉:

  • 当你想要这个项目的时候 与不同的人表现不同 错误。
  • 很好,如果你想提供 对最终用户有意义的 错误。

我知道很多人总是使用 Throws,因为它更干净,但是它几乎没有那么多的控制。

向方法中添加 try-catch 或 throw 子句的决定取决于“您希望(或已经)如何处理异常”。

如何处理异常是一个非常重要的问题。它特别涉及到决定在哪里处理异常以及在 catch 块中实现什么操作。事实上,如何处理异常应该是一个全局设计决策。

所以回答你的问题,没有经验法则。

您必须决定在哪里处理异常,这个决定通常非常特定于您的域和应用程序需求。

如果一个方法能够合理地保证对象的状态、传递给该方法的任何参数以及该方法作用于的任何其他对象的周围,那么它应该只将 throws作为异常。例如,假设一个方法要从一个集合中检索一个调用者期望包含在其中的项,如果这个项在集合中不存在,那么这个方法可能 throws是一个检查过的异常。捕获该异常的调用方应该预期集合不包含有关项。

请注意,虽然 Java 允许通过声明为抛出适当类型的异常的方法冒出已检查的异常,但是这种用法通常应该被视为反模式。例如,假设某个方法 LookAtSky()被声明为调用 FullMoonException,并且期望在满月时抛出; 进一步想象,LookAtSky()调用 ExamineJupiter(),它也被声明为 throws FullMoonException。如果一个 FullMoonExceptionExamineJupiter()抛出,而 LookAtSky()没有抓住它,或者处理它或者把它包裹在其他异常类型中,称为 LookAtSky的代码会假定这个异常是地球的月亮满月的结果; 它不会知道木星的一个卫星可能是罪魁祸首。

调用方可能期望处理的异常(基本上包括所有已检查的异常)只有在异常对调用方的意义与对被调用方的意义相同时,才允许通过方法渗透。如果代码调用一个被声明为抛出一些检查异常的方法,但是调用者并不期望它在实际中抛出这个异常(例如,因为它认为它预先验证了方法参数) ,那么检查异常应该被捕获并包装在一些未检查的异常类型中。如果调用方不希望引发异常,那么调用方就不能期望异常具有任何特定的含义。

如果使用 try catch,则在发生异常时,仍将执行其余代码。

如果指定引发异常的方法,那么当异常发生时,代码将立即停止执行。

当你想提供自定义行为时,使用 try-catch 对,以防异常发生... ... 换句话说... ... 根据你的程序需求,你有了问题的解决方案(异常发生) ... ..。

但抛出是用来当你没有任何具体的解决方案,对于异常发生的情况... 你只是不想得到异常终止你的程序... 。

希望它是正确的: -)

什么时候用,我找了很多关于这个的资料。 没有硬性规定。

”但是作为开发人员,检查异常必须包含在方法的 throw 子句中。这对于编译器知道要检查哪些异常是必要的。 按照惯例,未检查的异常不应包括在 throw 子句中。
包含它们被认为是不好的编程实践。编译器将它们视为注释,而不对它们进行检查。”

资料来源: SCJP 6,Kathy Sierra 著

我就直说了。 当您认为被调用的方法不负责异常时使用抛出(例如,来自调用方法的无效参数、要搜索的项、在集合中不可用的提取或提取数据列表)。 当您认为被调用方法中的功能可能导致某些异常时,请使用 try catch 块(处理被调用方法中的异常)