抛出或的try-catch

问题描述 投票:67回答:10

什么是决定是否将throws条款添加到一个方法或使用try-catch当一般的经验法则?

从我读过自己的throws时,应使用呼叫者已经打破他们的合同(传递的对象)的结束,当一个异常被里面的方法进行操作期间发生应使用try-catch。这个对吗?如果是这样,我应该在呼叫者侧做什么?

P.S:通过谷歌搜索和SO但想在这一个明确的答案。

java exception exception-handling try-catch throws
10个回答
53
投票
  • 捕获异常只有当你能够以有意义的方式处理它
  • 声明向上抛出异常,如果它是由当前方法的消费者办理
  • 抛出异常,如果他们是由输入参数引起的(但这些往往选中)

0
投票

的try-catch当你想提供定制行为,在情况下,如果出现异常,对用于.....换句话说...你有你的问题(发生异常)的解决方案,根据您的方案要求.... 。

但是,当抛出你没有关于发生异常情况下,任何具体的解决办法是使用......你只是不想让你的程序异常终止....

希望这是正确的:-)


14
投票

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

它应该捕捉来自调用的方法,如果一个例外:

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

9
投票

我个人的经验为的规则很简单:

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

注意:这是回信现在社区维基,随意添加更多的信息。


7
投票

下面是我用它的方式:

抛出:

  • 你只是想在发生错误时的代码停止。
  • 好与容易出错,如果某些先决条件不满足的方法。

试着抓:

  • 如果你想拥有的程序与不同的错误行为不同。
  • 伟大的,如果你想提供有意义的错误给最终用户。

我知道有很多人谁总是使用抛出,因为它是清洁的,但只是没有几乎一样多的控制。


3
投票

该决定增加一个try-catch或throws子句来你的方法取决于“怎么你想(或必须)来处理你的例外”。

如何处理异常是宽,远离琐碎问题的答案。它涉及到专门的地方来处理异常和catch块内实施何种行动的决定。事实上,如何处理异常应是一个全球性的设计决策。

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

你必须决定要处理你的例外,这个决定通常是非常特定于域和应用程序的需求。


2
投票

如果在异常得到了提出的方法具有信息的一个充分量来处理它,那么它应该去追,生成发生了什么和正在处理哪些数据有用的信息。


1
投票

一种方法,应该只throws一个异常,如果它可以使围绕该对象的状态合理的保证,任何参数传递给该方法,以及任何其他对象的方法作用在。例如,这是应该的方法从集合中获取其主叫预计包含在其中可能throws检查异常,如果这是预期集合中存在的项目,没有一个项目。其捕获该异常调用者应该想到的是,集合不包含有问题的项目。

请注意,虽然Java将允许多达通过它被声明为投掷适当类型的异常的方法检查异常到气泡,这种用法通常应该被认为是反模式。想象一下,例如,有的方法LookAtSky()被声明为调用FullMoonException,并有望把它当月圆的;进一步设想,即LookAtSky()调用ExamineJupiter(),这也被声明为throws FullMoonException。如果FullMoonExceptionExamineJupiter()抛出,如果LookAtSky()没抓住,要么办理或者在其他一些异常类型包装它,它叫LookAtSky将承担异常的代码是地球的月球充满的结果;那就没有任何线索,木星的卫星之一可能是罪魁祸首。

主叫者可能希望处理(包括基本上所有检查的异常)异常应只允许通过一种方法来渗透了,如果该异常将意味着该方法的调用者同样的事情,因为这意味着调用方法。如果代码调用该声明为抛出一些检查异常的方法,但主叫方不希望它永远抛出异常的做法(例如,因为它认为它预验证的方法参数),该检查的异常应该被捕获并包裹在一些未经检查的异常类型。如果来访者没有预期的异常被抛出,调用者不能指望它有什么特别的意义。


1
投票

何时使用什么。我搜索了很多关于这一点。有没有硬性规定。

“但是,作为一个开发者,经过异常必须包含在方法的throws子句中。这是必要的编译器知道要检查哪些异常。按照惯例,unchecked异常不应该被包含在一个throws子句。 包括他们被认为是编程习惯较差。编译器将它们视为注释,确实没有对他们的检查。”

来源:SCJP 6书凯西塞拉利昂


0
投票

如果你使用一个尝试捕捉,发生异常时,剩余的代码将仍会执行。

如果您指明该方法发生异常时抛出异常,那么,该代码将停止被立即执行。

© www.soinside.com 2019 - 2024. All rights reserved.