我有一些代码如下:
List<Exception> exceptions = new ArrayList<Exception>();
for (Foo foo : foos) {
try {
doStuff(foo);
} catch (FooException ex) {
exceptions.add(ex);
}
}
if (!exceptions.isEmpty())
logger.error("Exceptions occurred processing foos", exceptions);
在我的日志中,我会看到每个异常的完整详细信息,包括堆栈跟踪,原因链等。当然,这段代码实际上并不起作用。有没有办法获得它,所以一个日志条目包含所有这些?
至于为什么不记录每个异常,因为它被抓住了,原因是我正在使用SMTPAppender
而宁愿只收到一封关于此事件的电子邮件。
答案 0 :(得分:3)
这很简单&amp;干净的方式:
class CompositeException extends Exception {
private final List<Exception> es;
public CompositeException(Exception[] es) {
this.es = Arrays.asList(es);
}
public CompositeException(List<Exception> es) {
this.es = new ArrayList<Exception>(es);
}
@Override
public void printStackTrace(PrintStream s) {
for (Throwable e : this.es) {
e.printStackTrace(s);
}
}
}
List<Exception> exceptions = new ArrayList<Exception>();
for (Foo foo : foos) {
try {
doStuff(foo);
} catch (FooException ex) {
exceptions.add(ex);
}
}
答案 1 :(得分:1)
我一直在搞乱它,我能够将列表中每个Exception的堆栈跟踪组合成一个新的自定义异常:
public class MyException extends Exception {
public static void main(String[] args) throws MyException {
StringWriter errors = new StringWriter();
List<Exception> list = new ArrayList<>();
for (int i = 0; i < 10; i++) {
try {
divideByZero(i);
} catch (Exception e) {
e.printStackTrace(new PrintWriter(errors));
}
}
if (!errors.toString().isEmpty()) {
throw new MyException(errors.toString());
}
}
public MyException(String message) {
super (message);
}
public static int divideByZero(int i) {
return i/0;
}
}
这是一个非常人为的例子,但我只想传达我的想法......如果你愿意的话,你可以调整/改进它以包含更多信息。
这印刷了以下内容:
Exception in thread "main" MyException: java.lang.ArithmeticException: / by zero
at MyException.divideByZero(MyException.java:34)
at MyException.main(MyException.java:24)
java.lang.ArithmeticException: / by zero
at MyException.divideByZero(MyException.java:34)
at MyException.main(MyException.java:24)
java.lang.ArithmeticException: / by zero
at MyException.divideByZero(MyException.java:34)
at MyException.main(MyException.java:24)
at MyException.main(MyException.java:30)
答案 2 :(得分:0)
如果您不想要异常的堆栈跟踪,则可以遍历列表并在日志语句中为每个异常调用getMessage(或getLocalisedMessage)方法。这应该打印出异常的类型以及原因。