Trong Python, bạn có thể ném ngoại lệ một cách rõ ràng bằng cách sử dụng câu lệnh raise . Việc ném ngoại lệ cho phép bạn chỉ ra rằng đã xảy ra lỗi và kiểm soát luồng của chương trình của bạn bằng cách xử lý những ngoại lệ này một cách phù hợp.
Kích hoạt một ngoại lệ đề cập đến việc kích hoạt một điều kiện lỗi một cách rõ ràng trong chương trình của bạn. Điều này có thể hữu ích để xử lý các tình huống mà luồng bình thường của chương trình không thể tiếp tục do một lỗi hoặc một điều kiện không mong đợi.
Trong Python, bạn có thể nâng cao các ngoại lệ tích hợp như ValueError hoặc TypeError để chỉ ra các điều kiện lỗi phổ biến. Ngoài ra, bạn có thể tạo và nâng cao các ngoại lệ tùy chỉnh.
Bạn có thể nâng cao bất kỳ ngoại lệ tích hợp nào bằng cách tạo một thể hiện của lớp ngoại lệ và sử dụng câu lệnh raise. Cú pháp như sau −
raise Exception("This is a general exception")
Dưới đây là một ví dụ trong đó chúng ta ném ra một ValueError khi một hàm nhận được một đối số không hợp lệ −
def divide(a, b): if b == 0: raise ValueError("Cannot divide by zero") return a / b try: result = divide(10, 0) except ValueError as e: print(e)
Dưới đây là đầu ra của đoạn mã trên −
Cannot divide by zero
Ngoài các ngoại lệ tích hợp sẵn, bạn có thể định nghĩa và ném (raise) các ngoại lệ tùy chỉnh của riêng mình bằng cách tạo một lớp ngoại lệ mới kế thừa từ lớp ngoại lệ cơ bản (base Exception) hoặc bất kỳ lớp con nào của nó.
class MyCustomError(Exception): pass def risky_function(): raise MyCustomError("Something went wrong in risky_function") try: risky_function() except MyCustomError as e: print(e)
Đầu ra của đoạn mã trên như được hiển thị dưới đây −
Something went wrong in risky_function
Ngoại lệ tùy chỉnh rất hữu ích để xử lý các điều kiện lỗi cụ thể mà chỉ ứng dụng của bạn có, cung cấp báo cáo lỗi chính xác hơn và kiểm soát tốt hơn.
Để tạo một ngoại lệ tùy chỉnh trong Python, bạn định nghĩa một lớp mới kế thừa từ lớp Exception tích hợp sẵn hoặc bất kỳ lớp ngoại lệ tích hợp sẵn nào khác phù hợp. Lớp ngoại lệ tùy chỉnh này có thể có các thuộc tính và phương thức bổ sung để cung cấp ngữ cảnh chi tiết hơn về điều kiện lỗi.
Trong ví dụ này −
class InvalidAgeError(Exception): def __init__(self, age, message="Age must be between 18 and 100"): self.age = age self.message = message super().__init__(self.message) def set_age(age): if age < 18 or age > 100: raise InvalidAgeError(age) print(f"Age is set to {age}") try: set_age(150) except InvalidAgeError as e: print(f"Invalid age: {e.age}. {e.message}")
Kết quả thu được như được hiển thị dưới đây −
Invalid age: 150. Age must be between 18 and 100
Đôi khi, bạn có thể cần bắt một ngoại lệ, thực hiện các hành động cụ thể (chẳng hạn như ghi nhật ký, dọn dẹp hoặc cung cấp bối cảnh bổ sung), và sau đó ném lại cùng một ngoại lệ để được xử lý ở phía trên của ngăn xếp gọi.
Điều này hữu ích khi bạn muốn đảm bảo rằng một số hành động nhất định được thực hiện khi xảy ra ngoại lệ, nhưng vẫn cho phép ngoại lệ được truyền đi để xử lý ở cấp độ cao hơn.
Để tái phát một ngoại lệ trong Python, bạn sử dụng câu lệnh "raise" mà không chỉ định một ngoại lệ nào, điều này sẽ tái phát ngoại lệ cuối cùng đang hoạt động trong phạm vi hiện tại.
Trong ví dụ sau −
def process_file(filename): try: with open(filename, "r") as file: data = file.read() # Process data except FileNotFoundError as e: print(f"File not found: {filename}") # Re-raise the exception raise try: process_file("nonexistentfile.txt") except FileNotFoundError as e: print("Handling the exception at a higher level")
Sau khi thực thi đoạn mã trên, chúng ta nhận được kết quả sau −
File not found: nonexistentfile.txt Handling the exception at a higher level