代码之家  ›  专栏  ›  技术社区  ›  Coderer

在捕获多个Java异常时,如何添加状态信息而不编写重复的代码?

  •  3
  • Coderer  · 技术社区  · 14 年前

    我读过其他一些帖子,比如 this one 关于避免Java中的重复 catch 阻碍。显然,我 真正地 我们想要的是“multi-catch”,但鉴于java7还没有出现,有没有一个好的模式让我向异常添加状态,然后重新抛出它们,而不使用 catching the kitchen sink ?

    具体来说,我有一些代码进行库调用,可以抛出异常,但没有为成功调试提供足够的上下文。我发现自己遇到了一个问题,然后进入,将库调用包装为try/catch,捕获特定的异常,然后在 抓住 阻塞并重新抛出捕获的异常。然后我一遍又一遍地重新遍历这个循环,每次都会找到一个新的错误条件来记录。我最后得到了

    try {
      make_library_call();
    }
    catch (SomeException e){
      throw new SomeException ("Needed local state information is " + importantInfo, e);
    }
    catch (SomeOtherException e){
      throw new SomeOtherException ("Needed local state information is " + importantInfo, e);
    }
    catch (YetAnotherException e){
      throw new YetAnotherException ("Needed local state information is " + importantInfo, e);
    }
    

    我想我真正想看到的是

    try {
      make_lib_call();
    }
    catch(Exception e){
      e.AddSomeInformationSomehow("Needed Info" + importantInfo);
      throw e;
    }
    

    假设那样的话 e 在重新抛出时将保留其实际的运行时类型——在本例中,即使捕获unchecked也可能是可以的,因为我将重新抛出它们,并且它们也将受益于携带额外的状态信息。我想另一个可能是

    try{
      make_lib_call();
    }
    finally {
      if (/*an exception happened*/)
        logger.debug("Some state info: " + importantInfo);
    }
    

    2 回复  |  直到 7 年前
        1
  •  2
  •   Mark Peters    14 年前

    你可能在期待这个,但是 ,没有 (我所说的“好”是指“干净”)这样做的方法。您可能会期待它,因为您下意识地知道,如果有一个好的模式可以这样做,那么它可能不值得添加到Java7中。

    实际上是 final rethrow

        2
  •  2
  •   ob1    14 年前

    对于替代方案:

    boolean isOk = false;
    try{
      make_lib_call();
      isOk = true;
    }
    finally {
      if (!isOk)
        logger.debug("Some state info: " + importantInfo);
    }