Java 投或试接球

Java 投或试接球,java,exception,exception-handling,try-catch,throws,Java,Exception,Exception Handling,Try Catch,Throws,在决定是向方法添加throws子句还是使用try-catch时,一般的经验法则是什么 从我自己读到的内容来看,当调用方破坏了他们的契约结束(传递的对象)时,应该使用抛出,当在方法内部执行的操作期间发生异常时,应该使用尝试捕获。这是正确的吗?如果是的话,呼叫方应该做什么 注:通过Google等搜索,但希望得到一个明确的答案。一般来说,当方法无法在本地处理相关问题时,应该向其调用方抛出异常。例如,如果该方法应该从具有给定路径的文件中读取,IOExceptions无法以合理的方式在本地处理。这同样适用

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

从我自己读到的内容来看,当调用方破坏了他们的契约结束(传递的对象)时,应该使用
抛出
,当在方法内部执行的操作期间发生异常时,应该使用
尝试捕获
。这是正确的吗?如果是的话,呼叫方应该做什么


注:通过Google等搜索,但希望得到一个明确的答案。

一般来说,当方法无法在本地处理相关问题时,应该向其调用方抛出异常。例如,如果该方法应该从具有给定路径的文件中读取,
IOExceptions
无法以合理的方式在本地处理。这同样适用于无效输入,并补充说我个人的选择是抛出未经检查的异常,如本例中的
illegargumentexception

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

  • 它可以在本地处理(例如,尝试将输入字符串转换为数字,如果转换失败,则返回默认值是完全有效的)
  • 或者它不应该被扔掉(例如,如果异常来自特定于实现的较低层,调用方不应看到其实现细节-例如,我不想显示我的
    DAO
    使用
    Hibernate
    来持久化我的实体,因此我在本地捕获所有
    hibernateeexceptions
    ,并将它们转换为我自己的exc。)受体类型)
      • 只有当您能够以有意义的方式处理异常时,才能捕获异常
      • 如果异常将由当前方法的使用者处理,则声明向上抛出异常
      • 如果异常是由输入参数引起的,则抛出异常(但这些异常通常是未选中的)

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

          • 我能以一种有意义的方式处理它吗(从注释中添加)?因此,将代码放入
            try/catch
            。通过处理它,我的意思是能够通知用户/从错误中恢复,或者从更广泛的意义上说,能够理解此异常如何影响代码的执行
          • 在别处,把它扔掉

          注意:此回复现在是一个社区wiki,请随意添加更多信息。

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

          以下是我使用它的方式:

          抛出:

          • 您只希望代码在运行时停止 出现错误
          • 善于使用容易出错的方法 如果满足某些先决条件,则会出现错误 没有遇见
          尝试捕捉:

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

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

          在方法中添加try-catch或Throws子句的决定取决于“您希望(或必须)如何处理您的异常”

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

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


          您必须决定要在何处处理异常,该决定通常非常特定于您的域和应用程序要求。

          如果方法能够合理地保证对象的状态、传递给方法的任何参数以及任何其他对象,则只应
          抛出异常thod作用于。例如,如果预期存在于集合中的项不存在,则假定要从集合中检索调用者预期包含在其中的项的方法可能会抛出选中的异常。捕获该异常的调用者应预期集合中不包含t他提出了一个有问题的项目

          请注意,虽然Java将允许通过声明为抛出适当类型的异常的方法引发检查过的异常,但这种用法通常应被视为反模式
          被声明为调用
          FullMoonException
          ,并期望在满月时抛出它;进一步想象一下,
          LookAtSky()
          调用
          ExamineJupiter()
          ,该调用也被声明为
          抛出FullMoonException
          。如果
          FullMoonException
          是由
          ExamineJupiter()抛出的
          ,如果
          LookAtSky()
          没有捕捉到它,或者处理它,或者用其他异常类型将它包装起来,那么调用
          LookAtSky
          的代码将假定该异常是由于地球的卫星满月造成的;它将不知道木星的卫星之一可能是罪魁祸首

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

          如果是