6.1 Cố ý khởi tạo ngoại lệ
Trong Python, bạn có thể cố ý khởi tạo ngoại lệ bằng cách sử dụng toán tử raise. Điều này cho phép bạn báo hiệu rằng đã xảy ra lỗi hoặc tình huống không đúng trong chương trình của bạn. Hãy xem xét các cách khác nhau sử dụng toán tử raise và tái đóng gói ngoại lệ.
Khởi tạo ngoại lệ tiêu chuẩn
Cú pháp chung của thao tác này như sau:
raise exception
Bạn có thể khởi tạo các ngoại lệ tiêu chuẩn như Exception, TypeError và các ngoại lệ khác, bằng cách truyền cho chúng thông điệp tương ứng.
Ví dụ: raise Exception
def check_number(value):
if value < 0:
raise Exception("Xin lỗi, không có số nào dưới không")
try:
check_number(-5)
except Exception as e:
print(f"Đã bắt ngoại lệ: {e}")
Trong ví dụ này, nếu giá trị nhỏ hơn không, thì sẽ khởi tạo Exception với thông điệp "Xin lỗi, không có số nào dưới không".
Ví dụ: raise TypeError
def check_integer(value):
if not isinstance(value, int):
raise TypeError("Chỉ cho phép số nguyên")
try:
check_integer("string")
except TypeError as e:
print(f"Đã bắt ngoại lệ: {e}")
Trong ví dụ này, nếu giá trị không phải là số nguyên, thì sẽ khởi tạo TypeError với thông điệp "Chỉ cho phép số nguyên".
6.2 Tái đóng gói ngoại lệ
Đôi khi cần phải bắt một ngoại lệ và khởi tạo một ngoại lệ khác, cung cấp thông tin cụ thể hoặc hữu ích hơn. Điều này có thể được thực hiện bằng cách sử dụng toán tử raise ... from, giúp lưu giữ ngoại lệ gốc làm nguyên nhân cho ngoại lệ mới.
Cú pháp chung của thao tác này như sau:
raise ngoại_lệ_mới from ngoại_lệ_cũ
Ví dụ: Tái đóng gói ngoại lệ
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("Biến trống")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("Biến trống được phát hiện") from e
Trong ví dụ này, nếu giá trị biến trống, trước tiên sẽ khởi tạo ValueError với thông điệp "Biến trống". Ngoại lệ này sau đó bị bắt, và một ngoại lệ mới được khởi tạo EmptyVariableError với thông điệp "Biến trống được phát hiện", với ngoại lệ gốc được truyền qua from.
6.3 Phân tích ngoại lệ đã tái đóng gói
Sử dụng toán tử raise ... from cho phép giữ thông tin về chuỗi ngoại lệ, điều này có thể hữu ích cho việc gỡ lỗi. Bạn có thể phân tích các ngoại lệ đã tái đóng gói và nguyên nhân của chúng.
Ví dụ phân tích ngoại lệ đã tái đóng gói:
class EmptyVariableError(Exception):
pass
def check_non_empty(value):
if value == "":
raise ValueError("Biến trống")
try:
check_non_empty("")
except ValueError as e:
raise EmptyVariableError("Biến trống được phát hiện") from e
Chạy mã trên sẽ dẫn đến đầu ra sau:
Traceback (most recent call last): File "example.py", line 8, in
check_non_empty("") File "example.py", line 5, in check_non_empty raise ValueError("Biến trống") ValueError: Biến trống
The above exception was the direct cause of the following exception:
Traceback (most recent call last): File "example.py", line 10, in
raise EmptyVariableError("Biến trống được phát hiện") from e EmptyVariableError: Biến trống được phát hiện
Lỗi đầu tiên (được đánh dấu bằng màu xanh lá cây) — đây là lỗi gốc, xảy ra ở nơi nào đó sâu trong mã. Đôi khi những lỗi này xảy ra thường xuyên, và đó là hành vi bình thường của chương trình.
Lỗi thứ hai (được đánh dấu bằng màu xanh dương) — đây là lỗi ở cấp cao hơn. Chương trình hoặc framework của bạn cần biết cách xử lý nó. Nhưng nếu bạn muốn đi sâu hơn và biết lý do gây ra lỗi, thì lỗi màu xanh lá cây sẽ hữu ích cho bạn.
Mọi thứ được làm rất hợp lý.
GO TO FULL VERSION