Bài học theo mô-đun (4/4)
Xử lý lỗi: thử/ngoại trừ
Khi có sự cố xảy ra trong thời gian chạy (chia cho 0, thiếu khóa,
hoạt động trên các loại không tương thích) Python đưa ra ngoại lệ. không có
xử lý, ngoại lệ sẽ làm gián đoạn chương trình. Với try / except bạn
có thể nắm bắt nó và quyết định phải làm gì.
Hình thức cơ bản
try:
risultato = 10 / 0
except ZeroDivisionError:
risultato = None
risultato # None- khối
try:chứa mã có thể bị lỗi; except <ErrorType>:chỉ được thực thi nếu loại lỗi đó xuất hiện bên trongtry.
Bắt tin nhắn ngoại lệ
Sử dụng as để liên kết đối tượng ngoại lệ với tên:
try:
int("non è un numero")
except ValueError as e:
messaggio = str(e)
messaggio # "invalid literal for int() with base 10: 'non è un numero'"Nhiều loại với nhau
try:
valore = dati[chiave]
except (KeyError, IndexError):
valore = NoneMột bộ các loại sẽ bắt được bất kỳ ngoại lệ nào của các loại (hoặc các lớp con) đó.
Cấu trúc đầy đủ: thử/ngoại trừ/khác/cuối cùng
try:
n = int("42")
except ValueError:
print("not a number")
else:
print(f"parsed: {n}") # executed only if NO exception occurred
finally:
print("always executed") # executed regardless, even on exceptionelse— sử dụng nó cho mã phụ thuộc vào sự thành công củatry. Giữ nó tách biệt để bạn không vô tình bắt gặp những ngoại lệ không liên quan.finally— việc dọn dẹp luôn phải diễn ra (đóng tệp, giải phóng tài nguyên). Thực hiện cả khi thành công và có lỗi.
Đưa ra một ngoại lệ: raise
Đôi khi bạn là người muốn báo hiệu rằng có điều gì đó không ổn:
def diviso(a, b):
if b == 0:
raise ValueError("the divisor cannot be zero")
return a / bCác ngoại lệ tích hợp phổ biến nhất mà bạn sẽ gặp phải và nêu ra:
ValueError— giá trị đúng loại nhưng không được chấp nhận (ví dụ: phân tích cú pháp).TypeError— loại sai (ví dụ:len(42)).KeyError/IndexError— thiếu khóa/chỉ mục.ZeroDivisionError— chia cho 0.FileNotFoundError,PermissionError— hoạt động của hệ thống tệp.
Các mệnh đề khác và cuối cùng trong khối thử
Khối try có thể xác định hai mệnh đề bổ sung:
else: chỉ được thực thi nếu khốitryhoàn thành mà không đưa ra bất kỳ ngoại lệ nào.finally: luôn được thực thi, bất kể có xảy ra ngoại lệ hay không. Điều này lý tưởng để dọn dẹp tài nguyên (ví dụ: đóng một tệp đang mở hoặc kết nối cơ sở dữ liệu).
Hãy tự mình thử
Viết một biểu thức thử int('abc'): nếu ValueError được nâng lên, gán chuỗi 'errore' cho `result`; nếu không thì gán số. Đánh giá `kết quả`.
Hiển thị gợi ý
int('abc') tăng ValueError.
Giải pháp khả dụng sau 3 lần thử
Xem lại bài tập
Xác định `divide(a, b)` trả về a/b nhưng tăng ValueError với thông báo 'chia bằng 0' nếu b bằng 0. Sau đó gọi chia (10, 0) bên trong một lần thử/ngoại trừ và gán cho `message` chuỗi ngoại lệ bị bắt.
Hiển thị gợi ý
raise ValueError('...') bên trong hàm; bắt với ngoại trừ ValueError là e.
Giải pháp khả dụng sau 3 lần thử
Thử thách bổ sung
Viết khối \`try-ngoại trừ\` để chuyển đổi chuỗi \`text_val = "abc"\` thành số nguyên. Nếu quá trình chuyển đổi tạo ra \`ValueError\`, hãy gán \`None\` cho \`result\`. Nếu không, hãy chỉ định số đã chuyển đổi. Cuối cùng, đánh giá \`kết quả\`.
Hiển thị gợi ý
Sử dụng try: result = int(text_val) theo sau là ngoại trừ ValueError: result = None.
Giải pháp khả dụng sau 3 lần thử