如何处理java中由一个方法抛出到另一个方法中的异常?

wribegjk  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(376)

假设我有一门课:

public class Obj1{

...

 public void do_Something(int someParameter) throws SomeException {
     if(...) throw new SomeException();
...
 }
...
}

然后,某处

public class Obj2{
...
  public void do_SomeOtherThing(Obj1 obj1){
    obj1.do_Something();
    //apparently the only solution is try-catching it directly, even if I'm not in the main...
...
}

我已经了解到异常应该只由方法抛出,而由main捕获,因此,我的问题是:try-catch是处理子方法异常的唯一方法,还是最外部的方法(dou_something)将抛出它,以便我可以直接在main中尝试捕获它,删除object2类中的try-catch?
基本上,我可以做以下几点吗?

public static void main(String[] args){
  Object1 obj1 = new Object1();
  Object2 obj2 = new Object2();
  try{
    obj2.do_SomeOtherThing(obj1);
  }
  catch(SomeException e){
   ...
  }
}

还是不?

ncecgwcz

ncecgwcz1#

检查异常是方法与其调用方之间的契约的一部分,抛出的异常总是需要以某种方式处理。
正确答案取决于具体情况:
调用方可以处理异常:

String getStringFromRemoteServer() throws IOException { ... }

String getConfigString() {
  try {
    return getStringFromRemoteServer();
  } catch (IOException e) {
    LOG.warn("Failed to contact server, using local version.", e);
    return getLocalString();
  }
}

在这种情况下,我们有一个我们需要的替代数据源,因此如果首选方法失败,我们将捕获异常,记录它(以便我们知道网络存在问题)并调用替代方法。
异常是致命的,我们不希望调用树中的任何更高级别的函数尝试处理它。

Configuration parseConfiguration(String configString) throws ParseException { ... }

void loadConfiguration() {
  try {
    this.globalConfig = parseConfiguration(getConfigString());
  } catch (ParseException e) {
    throw new RuntimeException("Corrupted config", e);
  }
}

在这种情况下,异常意味着应用程序的配置被严重破坏。试图处理这个错误是没有意义的,我们的任何调用者试图处理它也是没有意义的,所以声明 throws 在…上 loadConfiguration() 只会让人感到混乱。我们将异常 Package 在一个 RuntimeException 然后重新播放它。请注意,我们不记录它——将有一些未捕获异常的顶级报告,因此在这里记录它将是重复的。
它仍然是有价值的 parseConfiguration() 抛出一个选中的异常,因为当我们从交互式配置编辑器调用它时,我们捕获异常并向用户显示一条错误消息。
也许我们的调用者可以处理这个异常。

int stringToInteger(String s) throws BadNumberException { ... }

String decimalStringToHexString(String s) throws BadNumberException {
  return intToHex(stringToInteger(s));
}

在这种情况下,我们不会更改异常的含义-- decimalStringToHexString 正在从字符串转换数字,一个可能的结果是该字符串非法。我们的呼叫者需要意识到这是一种可能的结果,就像我们的呼叫者一样 stringToInteger() 是,因此我们只需声明异常并让调用方处理它。我们的调用者知道他们在其中使用数字的上下文,因此他们可以决定如何处理异常。
有两条规则:
永远不要完全忽略异常(好的,可能是interruptedexception)。如果你写信 try { ... } catch (Exception e) {} 空catch子句将使您很难发现代码不工作的原因。
Package 异常时,始终将原始异常作为原因。

相关问题