Java: Ngoại lệ kết chuỗi (Chained Exception)
Giải phóng thời gian, khai phóng năng lực
Một ứng dụng thường phản ứng với một ngoại lệ bằng cách ném một ngoại lệ khác. Trong thực tế, ngoại lệ đầu tiên sẽ gây ra ngoại lệ thứ hai. Điều này có thể rất hữu ích để biết khi nào một ngoại lệ gây ra ngoại lệ khác. Ngoại lệ kết chuỗi (Chained Exception) sẽ giúp lập trình viên làm điều này.
Sau đây là các phương thức và hàm tạo của Throwable
có hỗ trợ ngoại lệ kết chuỗi.
Throwable getCause()
Throwable initCause(Throwable)
Throwable(String, Throwable)
Throwable(Throwable)
Đối số Throwable
của initCause
và hàm tạo Throwable
là ngoại lệ đã gây ra ngoại lệ hiện thời, còn getCause
thì trả về ngoại lệ đã gây ra ngoại lệ hiện thời, và initCause
sẽ thiết lập việc gây ra ngoại lệ hiện thời.
Ví dụ sau đây cho thấy cách sử dụng ngoại lệ kết chuỗi.
try {
} catch (IOException e) {
throw new SampleException("Other IOException", e);
}
Ở ví dụ trên, khi ngoại lệ IOException
được bắt thì một ngoại lệ mới là SampleException
sẽ được tạo với nguyên nhân ban đầu được đưa vào và chuỗi các ngoại lệ được ném lên trình xử lý ngoại lệ cao hơn.
Truy cập thông tin Stack Trace
Bây giờ ta hãy giả sử rằng trình xử lý ngoại lệ cấp cao hơn muốn đánh dấu vết ở định dạng riêng của nó.
Định nghĩa: Một vết đống (stack trace) cung cấp thông tin về lịch sử thực hiện thread hiện tại và liệt kê tên của các lớp và phương thức đã được gọi tại thời điểm khi các ngoại lệ xảy ra. Vết đống là một công cụ gỡ lỗi hữu ích mà bạn sẽ thường tận dụng khi một ngoại lệ được ném ra.
Đoạn mã sau đây cho thấy cách gọi phương thức getStackTrace
trên đối tượng ngoại lệ.
catch (Exception cause) {
StackTraceElement elements[] = cause.getStackTrace();
for (int i = 0, n = elements.length; i < n; i++) {
System.err.println(elements[i].getFileName() + ":" + elements[i].getLineNumber() + ">> " + elements[i].getMethodName() + "()");
}
}
Logging API
Đoạn mã tiếp theo ghi lại nơi một ngoại lệ xảy ra từ bên trong khối catch
. Tuy nhiên, thay vì tự phân tích vết đống và gửi đầu ra đến System.err()
, nó sẽ gửi đầu ra vào một tập tin bằng cách sử dụng logging ficility trong gói java.util.logging
.
try {
Handler handler = new FileHandler("OutFile.log");
Logger.getLogger("").addHandler(handler);
} catch (IOException e) {
Logger logger = Logger.getLogger("package.name");
StackTraceElement elements[] = e.getStackTrace();
for (int i = 0, n = elements.length; i < n; i++) {
logger.log(Level.WARNING, elements[i].getMethodName());
}
}
Giải phóng thời gian, khai phóng năng lực