4.1 Bắt nhiều ngoại lệ
Python cho phép xử lý nhiều ngoại lệ bằng cách sử dụng nhiều khối except
hoặc một khối except
với bộ ngoại lệ. Hãy cùng xem xét cả hai cách tiếp cận.
Nhiều khối except
Bạn có thể sử dụng nhiều khối except
để xử lý các loại ngoại lệ khác nhau theo cách khác nhau.
try:
# Mã có thể gây ra ngoại lệ
result = int("abc")
except ValueError:
print("Lỗi: giá trị không hợp lệ.")
except ZeroDivisionError:
print("Lỗi: chia cho không.")
Một khối except
với bộ ngoại lệ
Bạn có thể xử lý nhiều ngoại lệ trong một khối except
bằng cách truyền chúng dưới dạng bộ.
try:
# Mã có thể gây ra ngoại lệ
result = int("abc")
except (ValueError, ZeroDivisionError) as e:
print(f"Đã xảy ra lỗi: {e}")
Sử dụng except
NameError
as
var
Khi xử lý ngoại lệ, bạn có thể sử dụng cú pháp
except
<ExceptionType>
as
<variable>
để lấy đối tượng ngoại lệ. Điều này cho phép truy cập vào thông tin về ngoại lệ, chẳng hạn như thông báo lỗi và các thuộc tính khác.
try:
# Mã có thể gây ra NameError
print(undeclared_variable)
except NameError as e:
print(f"Đã xảy ra lỗi: {e}")
print(f"Loại lỗi: {type(e)}")
4.2 Phạm vi biến lỗi
Biến lưu ngoại lệ (e
trong ví dụ trên) chỉ có sẵn chỉ trong khối except
của nó. Bên ngoài khối này, biến không khả dụng.
try:
# Mã có thể gây ra NameError
print(undeclared_variable)
except NameError as e:
print(f"Đã xảy ra lỗi: {e}")
print(f"Loại lỗi: {type(e)}")
# Ở đây e đã không còn khả dụng, và dòng tiếp theo sẽ gây ra lỗi NameError
# print(e) # NameError: name 'e' is not defined
Nếu bạn muốn thực hiện điều gì đó quan trọng với ngoại lệ ngoài khối của nó, bạn cần lưu trữ nó trong một biến riêng. Ví dụ:
exception = None
try:
# Mã có thể gây ra ngoại lệ
result = int("abc")
except ValueError as e:
exception = e
print("Lỗi: giá trị không hợp lệ.")
except ZeroDivisionError as e:
exception = e
print("Lỗi: chia cho không.")
print(exception)
Lưu ý rằng biến exception
lưu trữ ngoại lệ phát sinh cuối cùng, điều này có thể hữu ích khi xử lý tiếp theo ngoài khối try
.
4.3 Những thông tin hữu ích trong lỗi
Đối tượng ngoại lệ chứa thông tin về lỗi. Tùy thuộc vào loại ngoại lệ, đối tượng có thể chứa các thuộc tính khác nhau.
Đây là một số thuộc tính chung có sẵn cho hầu hết các ngoại lệ:
-
args
: Bộ chứa các đối số được truyền khi tạo ngoại lệ. Thông thường đây là thông báo lỗi. -
message
: Chuỗi chứa thông báo lỗi (trong một số ngoại lệ). -
__str__
: Phương thức trả về biểu diễn chuỗi của ngoại lệ. Phương thức này được sử dụng để lấy biểu diễn văn bản của lỗi, sẽ được trả về khi sử dụng hàmprint()
trên đối tượng ngoại lệ.
Ví dụ:
try:
# Mã có thể gây ra ValueError
result = int("abc")
except ValueError as e:
print(f"Đã xảy ra lỗi: {e}")
print(f"Tham số lỗi: {e.args}")
print(f"Thông báo lỗi: {str(e)}")
Ví dụ về xử lý nhiều ngoại lệ
try:
# Mã có thể gây ra nhiều loại ngoại lệ
result = 10 / 0
except (ValueError, ZeroDivisionError) as e:
print(f"Đã xảy ra lỗi: {e}")
print(f"Loại lỗi: {type(e)}")
print(f"Tham số lỗi: {e.args}")
Nếu phát sinh ValueError
hoặc ZeroDivisionError
, chúng sẽ bị bắt bởi khối except
. Thông tin về ngoại lệ sẽ có sẵn thông qua biến e
. Kết quả sẽ bao gồm loại lỗi và các tham số được truyền khi tạo ngoại lệ.
GO TO FULL VERSION