【问题标题】:exceptions handling error scenario异常处理错误场景
【发布时间】:2017-06-27 20:07:11
【问题描述】:

我有以下场景:

  Class C{
  mainCall(){
try{
     //do something;
 }catch(MyException e)
     //doSomethingElse;
  }
}

Class A{
methodOne() throws myException{
 b.callMethodTwo();
}
}

class B{
callMethodTwo() throws myException{
  try {
            value = callService()//call some service
        } catch(HttpClientErrorException | HttpServerErrorException e){
            throw new MyException(e);
        }
 return value;
   }
}

如果在 callMethodTwo() 中发生了一些异常(不是 HttpClientErrorException 或 HttpServerErrorException)。这种情况下的流程是什么? 方法 C 中 mainCall() 中的 catch 部分是否会执行?我的代码中有近 5 次链式调用,但在这里尝试简化并生成了这个 sceario。

【问题讨论】:

  • 这不是一个完整的示例,但异常会继续冒泡,直到它们被捕获或应用程序崩溃。

标签: java spring exception httpexception


【解决方案1】:

如果callMethodTwo方法中的语句value = callService();抛出

  1. HttpClientErrorExceptionHttpServerErrorException 或其子类型的异常,将被以下catch 块捕获。这个catch 块将引发MyException 类型的新异常,该异常将冒泡到methodOne,然后冒泡到mainCall,最终将被catch 块捕获。
  2. MyException 或其子类型的异常,它将从callMethodTwo 冒泡到callMethodOnemainCall,最终被catch 块捕获。
  3. 任何其他类型的异常,它会从callMethodTwo冒泡到callMethodOnemainCallmainCall的调用方法。

【讨论】:

    【解决方案2】:

    已处理异常以外的异常不会进入该 catch 块,因此 myException 不会被 callMethodTwo 抛出。

    【讨论】:

      【解决方案3】:

      执行并验证它。你永远不会忘记。 callMethodTwo() 将抛出未捕获的异常。 A.methodOne() 将返回相同的内容。 C.catch 会抓住它。

      【讨论】:

      • 那么 C 中的行为是什么?我只捕获 myException 并在那里做某事。如果是未捕获的异常,我在 C 中的捕获会发生什么?流动会进入它吗?
      • 你在 C 中没有捕获的另一个异常变成了未捕获的异常。见前两段docs.oracle.com/javase/tutorial/essential/exceptions/…
      【解决方案4】:

      你没有在 C mainCall() 中调用任何 A/B 方法。你应该有一些可以抛出 MyException 的代码,然后只有你可以捕捉到那里。

      【讨论】:

        猜你喜欢
        • 2013-07-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-03
        • 1970-01-01
        • 2013-10-24
        • 2012-09-15
        • 2011-04-03
        相关资源
        最近更新 更多