7

最终,我想

if (badThingsHappen) {
 log the issue
 throw exception with description
}

这里明显的冗余是异常描述和要记录的消息(通常)是相同的。

这看起来不必要的冗长

if (badThingsHappen) {
 logger.error("oh no! not again!");
 throw new AppException("oh no! not again!");
}

声明临时字符串感觉不对

if (badThingsHappen) {
 String m = "oh no! not again!";
 logger.error(m);
 throw new AppException(m);
}

是否可以让 Exception 的构造函数处理日志记录?有没有更好(更清洁)的方法?

4

4 回答 4

3

您可以使用实用方法:

public class AppException extends Exception {
    public static AppException logAndThrow(Logger logger, String message) throws AppException {
        AppException e = new AppException(message);
        // log the stack trace as well
        logger.error(message, e);
        throw e;
    }
}

并使用它:

if (badThingsHappen) {
    AppException.logAndThrow(logger, "oh no! not again!");
}
于 2012-04-30T17:02:02.737 回答
2

我通常更喜欢在捕获异常时记录异常,而不是在抛出异常时记录它们。

这会更多地清理日志,并且还可以让“客户端”代码更精确地处理异常和信息输出,因为您希望在记录时与异常关联的信息可能取决于上下文。

如果您确实想在它发生时立即记录,我会构建异常并在抛出之前记录它,例如:

if(badthingshappen){
    Exception e = new Exception("holy $%##");
    logger.log(e);
    throw e;
}

有点冗长是的......但这java。

于 2012-04-30T16:59:49.260 回答
1

今天自己写了一个错误记录方法(这个是用来记录错误,如果它们发生在监听器方法中,所以它也记录了发生错误的方法和实现监听器的对象以帮助跟踪) :

protected void listenerError(String listenerMethodName, Object listener,
        RuntimeException e) {
    logger.error("Exception while calling " + listenerMethodName
            + " on object " + listener, e);
    throw e;

}

我在有问题的类(或者确切地说是基类)中编写了它,因为您可能想在该类(以及所有子类)中使用记录器。另一种选择是在实用程序类中创建实用程序方法(我不会为它编写异常类),并提供记录器作为参数:

class ExceptionUtil {

  public static error(Exception e, Logger logger) {
     logger.error(e);
     throw e;
  }
}

当然,您可以根据需要提供方法和对象作为此方法(或其重载版本)的参数。

于 2012-04-30T18:55:53.520 回答
1

通常在处理异常和日志记录要求时,我会在异常中包含日志记录支持。

异常通常从我们项目中的 Base Exception 类继承,并且它具有用于日志记录log4j或其他日志记录实用程序的挂钩。

class Problem extends java.lang.Exception {
  private boolean debug=false;
  public Problem(String message) {
    if(debug) {
      logging.exception(message);
      /* Maybe a stack trace? */
    }
  }
}
于 2012-04-30T17:00:39.790 回答