投掷和记录例外,这是一种更好的方法

时间:2012-04-30 16:53:34

标签: java error-handling

最终,我想

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 个答案:

答案 0 :(得分: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!");
}

答案 1 :(得分:1)

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

这样可以更加清理日志,并且还可以让“客户端”代码更精确地处理异常和信息输出,因为在日志记录时要与异常关联的信息可以依赖于上下文。 / p>

如果你想要一旦发生就要记录,我会建立异常并在抛出之前记录它,例如:

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

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

答案 2 :(得分:1)

通常在使用Exceptions和日志记录要求时,我在“例外”中包含日志记录支持。

异常通常继承自我们项目中的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? */
    }
  }
}

答案 3 :(得分:1)

我今天自己编写了一个错误记录方法(如果它们出现在侦听器方法中,它用于记录错误,因此它还记录发生错误的方法和实现侦听器的对象帮助跟踪):

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

}

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

class ExceptionUtil {

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

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