Java: Ngoại lệ kết chuỗi (Chained Exception)

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
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());
    }
}

» Tiếp: Tạo lớp ngoại lệ
« Trước: Dùng throw để ném ngoại lệ
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!