Tôi không chắc chắn nếu đây là những gì bạn đang tìm kiếm, nhưng có một xử lý cho trường hợp ngoại lệ chấm dứt chủ đề. Nó là một trình xử lý cho bất kỳ ngoại lệ nào không bị bắt một cách rõ ràng bởi đích của luồng.
Trình xử lý ngoại lệ chưa xử lý mặc định chỉ cần gọi printStackTrace()
trên Throwable
để in dấu vết ngăn xếp thành System.err
. Tuy nhiên, bạn có thể replace này với riêng UncaughtExceptionHandler
bạn mà ghi lại ngoại lệ cho Log4j thay vì:
class Log4jBackstop implements Thread.UncaughtExceptionHandler {
private static Logger log = Logger.getLogger(Log4jBackstop.class);
public void uncaughtException(Thread t, Throwable ex) {
log.error("Uncaught exception in thread: " + t.getName(), ex);
}
}
Nếu bạn đang sử dụng một khuôn khổ thi hành di chúc mà bạn vượt qua một đối tượng Runnable
, chủ đề của nó có thể có catch
khối riêng của họ mà ngăn chặn ngoại lệ từ việc đạt được trình xử lý ngoại lệ chưa được nắm bắt. Nếu bạn muốn nắm bắt Runtime
trường hợp ngoại lệ ở đó, một cách để thực hiện việc này là bao bọc từng tác vụ trong trình bao bọc nhật ký, như sau:
class Log4jWrapper {
private final Logger log;
private final Runnable target;
Log4jWrapper(Logger log, Runnable target) {
this.log = Objects.requireNonNull(log);
this.target = Objects.requireNonNull(target);
}
public void run() {
try {
target.run();
} catch(RuntimeException ex) {
log.error("Uncaught exception.", ex);
throw ex;
}
}
}
...
Runnable realTask = ...;
executor.submit(new Log4jWrapper(Logger.getLogger(Whatever.class), realTask));
Bạn có nghĩa là "không xác định" ngoại lệ thời gian không? –
Vâng, tôi có nghĩa là "không bị bắt buộc" RuntimeExceptions – DkS