[英]log4j: log multiple exceptions at once?
我有一些類似以下的代碼:
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
,而只希望收到一封與此有關的電子郵件。
這是簡單干凈的方法:
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);
}
}
我一直在搞弄它,我能夠將列表中每個Exception的堆棧跟蹤組合在一起,以傳遞到新的自定義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)
如果您不希望堆棧跟蹤異常,則可以遍歷該列表,並在日志語句中為每個異常調用getMessage(或getLocalisedMessage)方法。 那應該打印出異常的類型以及原因。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.