Tùy Chỉnh Exception (Custom Exception)

Trong Java, bạn có thể tạo ngoại lệ tùy chỉnh (custom exception) bằng cách kế thừa từ lớp Exception hoặc một lớp ngoại lệ khác. Việc tạo ngoại lệ riêng được gọi là ngoại lệ tùy chỉnh hoặc ngoại lệ do người dùng định nghĩa. Về cơ bản, ngoại lệ tùy chỉnh Java được sử dụng để tùy chỉnh ngoại lệ theo nhu cầu của người dùng. Việc tạo ngoại lệ tùy chỉnh giúp bạn:

↳ Làm rõ nguyên nhân lỗi: Mô tả chi tiết hơn về lỗi xảy ra, giúp quá trình gỡ lỗi trở nên dễ dàng hơn.

↳ Cải thiện khả năng đọc mã: Mã nguồn trở nên rõ ràng và dễ hiểu hơn khi sử dụng các ngoại lệ tùy chỉnh.

↳ Tăng cường tính bảo mật: Bạn có thể tạo các ngoại lệ tùy chỉnh để bảo vệ thông tin nhạy cảm hoặc ngăn chặn các hành vi không hợp lệ.

Khi nào nên sử dụng ngoại lệ tùy chỉnh?

↳ Lỗi domain-specific: Khi bạn muốn tạo các ngoại lệ cụ thể cho một domain (lĩnh vực) nhất định, ví dụ như ngoại lệ InvalidUserException trong một ứng dụng quản lý người dùng.

↳ Cần thông tin chi tiết về lỗi: Khi bạn muốn cung cấp thêm thông tin về lỗi để giúp quá trình gỡ lỗi trở nên dễ dàng hơn.

↳ Muốn kiểm soát cách xử lý lỗi: Bạn có thể tạo các ngoại lệ tùy chỉnh để kiểm soát cách các lỗi được xử lý trong ứng dụng của mình.

Để tạo ngoại lệ tùy chỉnh trong Java, bạn cần kế thừa lớp Exception hoặc một trong các lớp con của nó (như RuntimeException nếu bạn muốn tạo một ngoại lệ không kiểm tra được). Dưới đây là các bước cơ bản để tạo một ngoại lệ tùy chỉnh:

↳ Tạo một lớp mới kế thừa từ Exception hoặc RuntimeException.

↳ Cung cấp các hàm khởi tạo (constructors) phù hợp. Bạn có thể cung cấp các hàm khởi tạo để truyền thông điệp lỗi và/hoặc nguyên nhân của ngoại lệ.

↳ (Tùy chọn) Thêm các phương thức hoặc thuộc tính bổ sung nếu cần. Điều này giúp cung cấp thêm thông tin về ngoại lệ.

Ví dụ

// Ngoại lệ tùy chỉnh kế thừa từ RuntimeException (unchecked exception)
class InvalidAgeRuntimeException extends RuntimeException {
    // Hàm khởi tạo với thông điệp lỗi
    public InvalidAgeRuntimeException(String message) {
        super(message);
    }
}

Giải thích:

↳ public class InvalidAgeRuntimeException extends RuntimeException: Tạo một lớp mới tên là InvalidAgeRuntimeException kế thừa từ lớp RuntimeException. Điều này nghĩa là InvalidAgeRuntimeException là một loại ngoại lệ.

↳ public InvalidAgeRuntimeException (String message): Định nghĩa một constructor (hàm tạo) cho lớp InvalidAgeRuntimeException với một tham số là chuỗi message.

↳ super(message): Gọi constructor của lớp cha (lớp RuntimeException) và truyền chuỗi message vào đó. Điều này sẽ lưu trữ thông báo lỗi trong đối tượng ngoại lệ.

Bằng cách này, chúng ta đã tạo một ngoại lệ tùy chỉnh có tên InvalidAgeRuntimeException với một constructor để thiết lập thông báo lỗi.

Dưới đây là một ví dụ về việc tạo một ngoại lệ tùy chỉnh kế thừa từ lớp Exception:

Ví dụ: Example.java

// Ngoại lệ tùy chỉnh kế thừa từ Exception (checked exception)
class InvalidAgeException extends Exception {
    // Hàm khởi tạo với thông điệp lỗi
    public InvalidAgeException(String message) {
        super(message);
    }
}
    // Sử dụng ngoại lệ tùy chỉnh
class VotingSystem {
    // Phương thức kiểm tra tuổi có thể ném ngoại lệ InvalidAgeException
    public void checkAge(int age) throws InvalidAgeException {
        if (age < 18) {
            throw new InvalidAgeException("Tuổi phải từ 18 trở lên để bầu cử.");
        } else {
            System.out.println("Tuổi hợp lệ để bầu cử: " + age);
        }
    }
}
    // Sử dụng ngoại lệ tùy chỉnh
public class Example {
    public static void main(String[] args) {
        VotingSystem votingSystem = new VotingSystem(); // Tạo đối tượng VotingSystem

        try {
            votingSystem.checkAge(16); // Thử kiểm tra tuổi không hợp lệ
        } catch (InvalidAgeException e) {
            System.out.println("Ngoại lệ xảy ra: " + e.getMessage());
        }
        
        System.out.println("Chương trình tiếp tục chạy...");
    }
}

Kết quả của chương trình là:

Ngoại lệ xảy ra: Tuổi phải từ 18 trở lên để bầu cử.
Chương trình tiếp tục chạy...

Khi chạy chương trình, nếu bạn gọi checkAge với một tuổi không hợp lệ (ví dụ: 15), ngoại lệ InvalidAgeException sẽ được ném và thông điệp lỗi sẽ được hiển thị, Nếu tuổi hợp lệ (ví dụ: 20), chương trình sẽ in ra thông báo tuổi hợp lệ.

Dưới đây là một ví dụ minh họa cách tạo và sử dụng một ngoại lệ tùy chỉnh kế thừa từ Exception. Lớp này không có thêm bất kỳ phương thức hay thuộc tính nào.

Ví dụ: Example.java

 // Lớp đại diện cho ngoại lệ tùy chỉnh
class MyCustomException extends Exception {
    // Không có hàm khởi tạo hoặc phương thức bổ sung
}
// Lớp sử dụng ngoại lệ tùy chỉnh MyCustomException
public class Example {
    // Phương thức main
    public static void main(String args[]) {
        try {
            // Ném ra một đối tượng của ngoại lệ tùy chỉnh
            throw new MyCustomException();
        } catch (MyCustomException ex) {
            System.out.println("Đã phát hiện ngoại lệ");
            System.out.println(ex.getMessage());
        }

        System.out.println("Chương trình tiếp tục chạy...");
    }
}

Kết quả của chương trình là:

Đã phát hiện ngoại lệ
null
Chương trình tiếp tục chạy...

Trong ví dụ này, null là kết quả của ex.getMessage() vì không có thông điệp lỗi nào được truyền khi tạo ngoại lệ. Hy vọng ví dụ này giúp bạn hiểu rõ cách tạo, ném, và xử lý ngoại lệ tùy chỉnh trong Java, đồng thời cho thấy sự tiếp tục của luồng thực thi sau khi ngoại lệ được xử lý.

Câu Nói Truyền Cảm Hứng

“Bắt đầu ở đâu không quan trọng, quan trọng là bạn sẵn sàng bắt đầu.” – W. Clement Stone

Không Gian Tích Cực

“Chúc bạn luôn giữ vững niềm tin và sức mạnh để vượt qua mọi thử thách trong cuộc sống.”