最终,我想
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的构造函数处理日志记录?是否有更好(更清洁)的方式?
答案 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;
}
}
当然,您可以根据需要将方法和对象作为此方法的参数(或其重载版本)提供。