Chuyển đến nội dung chính
Mô-đun 2 · Bài học 4 trong tổng số 48/36 trong khóa học~12 min
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

Python
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 trong try.

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:

Python
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

Python
try:
    valore = dati[chiave]
except (KeyError, IndexError):
    valore = None

Mộ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

Python
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 exception
  • else — sử dụng nó cho mã phụ thuộc vào sự thành công của try. 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:

Python
def diviso(a, b):
    if b == 0:
        raise ValueError("the divisor cannot be zero")
    return a / b

Cá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ối try hoà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ử

tập thể dục#python.m2.l4.e1
Nỗ lực: 0Đang tải…

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ả`.

Đang tải trình chỉnh sửa…
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

tập thể dục#python.m2.l4.e2
Nỗ lực: 0Đang tải…

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.

Đang tải trình chỉnh sửa…
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

tập thể dục#python.m2.l4.e3
Nỗ lực: 0Đang tải…

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ả\`.

Đang tải trình chỉnh sửa…
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ử