【问题标题】:Exception Handling in JavaJava中的异常处理
【发布时间】:2011-03-21 21:14:07
【问题描述】:

是否可以让我所有的 try/catch 代码捕获超类异常,然后让一些 util 类找出异常的类型,以便我可以记录特定类型? 例如:

CustomLog{
  Logger log= ....

  public static logTrace(Exception e){
    log.debug("name of exception: " + e.????);
  }

}

SomeOtherClass{

  try{

  }catch(Exception e){
    CustomLog.logTrace(e);
  }

}

或者我的目标是什么(在代码中只包含通用异常)有更好的想法吗?

【问题讨论】:

  • 有可能,但这是个好主意吗? try {} 中有什么样的代码来激发这个解决方案?编辑:纳米;误解了。
  • Logger 提供什么包?日志4j? slf4j?普通老java.util.logging?
  • @Bittrance:但我认为这是一个很好的观点。只有“通用”异常实际上会解决什么问题?您希望以特定的方式捕获和处理异常,这就是重点。
  • 为什么只需要异常的类/名称?如果您执行e.printStackTrace() 或将Exception 传递给Logger 方法,您将获得打印的堆栈跟踪,它非常更有价值。

标签: java exception logging


【解决方案1】:

如果您的意图只是记录有关异常的信息,那么只需将 Exception 传递给适当的记录方法,让记录器为您完成工作:

log.error("Exception caught", e)

MostloggingAPIssupportThrowable 作为其debug()error() 等方法的参数。除非您有真正的理由,否则无需重新发明轮子。

关于您关于架构的问题(“有没有更好的想法”部分),您可以遵循一条基本规则:如果您可以对异常执行某些操作(例如回滚事务),则捕获它并执行适当的操作.如果您无法从中恢复,则将其从您的方法中抛出并让调用者处理它。

最终,不可恢复的异常将向上传播到容器(无论是主方法、servlet 容器还是其他)。然后容器可以写入日志、发送警报或以其他方式处理异常。

不要使用一般的Exception(就像你建议的那样)。 不要捕捉到某些东西,记录下来,然后像没有发生一样继续处理(除非真的对您的具体情况有意义)。如果您无法处理异常,请将其从您所在的方法中抛出,并让更高级别的方法处理它。

【讨论】:

  • @bmw0128 - 没问题。在 StackOverflow 中搜索 exception handling 并阅读一些答案。他们将为您提供一些见解;这个话题已经涉及了很多。
  • 我希望我能给你 2 票支持“不要使用一般异常”建议““catch (Exception e) { }”是我的祸根存在。那和“public void foo() throws Exception”让我想伤害一些东西。
【解决方案2】:

试试:

e.getClass().getName()

但是,如果它是包装异常,您可能需要考虑记录它的原因。

【讨论】:

    【解决方案3】:

    Exception.toString() 会给你你想要的,我想。

    【讨论】:

      【解决方案4】:

      只要 CustomLog 可以访问 Exception 的专用类,那么可以。

      你甚至可以在你的 CustomLog 代码中做这样的事情:

      logTrace(Exception ex) {
         try {
             throw ex;
         } catch(CustomException ex) {
             // specialized handling of CustomException
         } catch(Exception ex) {
             // unknown exception
         }
      }
      

      【讨论】:

      • 一个快速免责声明:如果您只想记录异常,那么 toString()、getMessage() 和此类方法可能就是您想要使用的全部。异常类本身应该为这些调用提供有意义的结果。您通常不希望将此逻辑推送到日志记录包中。
      猜你喜欢
      • 2015-09-16
      • 1970-01-01
      • 1970-01-01
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-09
      相关资源
      最近更新 更多