1. Trường hợp ngoại lệ (Exception) trong Python

Trong Python, khi thực thi một chương trình mà xuất hiện lỗi thì có thể có hai loại, một là lỗi cú pháp và hai là lỗi ngoại lệ. Lỗi là các vấn đề trong một chương trình mà do đó chương trình sẽ ngừng thực thi. Các ngoại lệ được đưa ra với mục đích phá vỡ luồng thực thi chương trình đó. Khi một ngoại lệ xuất hiện, chương trình sẽ ngừng thực thi, chuyển qua quá trình gọi và in ra lỗi đến khi nó được xử lý.

Việc xử lý ngoại lệ trong Python, sẽ tạo ra một exception để xử lý vấn đề đó tránh cho ứng dụng hay server của bạn bị gặp sự cố. Trong Python cung cấp cho chúng ta câu lệnh Try…Except để sử lý ngoại lệ. Dưới đây là minh họa về cách hoạt động của Try…Except trong Python. Để hiểu chi tiết hơn, chúng ta sẽ cùng nhau tìm hiểu cách xử lý ngoại lệ trong Python ở phần hai.

2. Xử lý ngoại lệ trong Python

2.1 Xử lý ngoại lệ bằng Try…Except trong Python

Xử lý ngoại lệ là trường hợp xử lý, thao tác với chương trình khi phát sinh ra lỗi trong quá trình thực thi. Trong Python, để xử lý trường hợp ngoại lệ ta sẽ sử dụng câu lệnh Try…Except.

Khối Try được sử dụng để thử chạy một vài câu lệnh bên trong nó và tìm ra lỗi, điều này nghĩa là các câu lệnh bên trong khối Try sẽ chỉ được thực thi khi không có lỗi trong chương trình. Trong khi các câu lệnh bên trong khối Except sẽ thực thi bất cứ khi nào chương trình gặp một số lỗi trong Try thử trước đó.

Một ví dụ đơn giản, sử dụng câu lệnh Try…Except để xử lý trường hợp ngoại lệ.

try:
    # Thu in gia tri x
    print(x)
except: # Neu co loi trong Try se thuc thi cau lenh trong Except
    print("Mot ngoai le da say ra!")

Kết quả:

Mot ngoai le da say ra!

Giải thích:

  • Trong ví trên,sử dụng câu lệnh Try để thử thực hiện in ra giá trị của biến xnếu việc thử in ra màn hình biến x trong câu lệnh Try gây ra lỗi thì chương trình sẽ thực hiện câu lệnh bên trong Except. 
  • Như ta thấy, trong câu lệnh Try thực hiện câu lệnh print(x) tuy nhiên biến x lại chưa được khai báo trong chương trình. Vì vậy, khi thực thi câu lệnh trong Try sẽ gây ra một lỗi và khi có lỗi thì các câu lệnh bên trong Except được thực thi. Thế nên, kết quả sau khi chương trình thực thi sẽ là: “Mot ngoai le da say ra!”

Chú ý: Nếu việc gọi câu lệnh print(x) nằm bên ngoài câu lệnh Try ở chương trình trên thì một thông báo lỗi sẽ hiển thị và trường hợp ngoại lệ sẽ không được xử lý!

2.2 Xử lý nhiều ngoại lệ bằng Try…Except trong Python

Bạn có thể xác định bao nhiêu khối Except tùy thích. Các câu lệnh bên trong khối Except được thực thi khi có một lỗi trùng với lỗi được khai báo ở Except.

Một ví dụ đơn giản, sử dụng câu lệnh Try…Except…Exxcept để xử lý nhiều trường hợp ngoại lệ.

try:
    # Thu in gia tri x
 	print(x)
except NameError: # Neu ton tai loi NameError
    print("Bien chua duoc dinh nghia")
except: # Neu ton tai loi khac
    print("Da co mot loi khac trong chuong trinh")

Kết quả:

Bien chua duoc dinh nghia

Giải thích:

  • Ví dụ trên, sử dụng Try để thử in ra màn hình giá trị của biến x.
  • Nếu chương trình thực thi trong Try gây ra lỗi NameError thì sẽ thực thi Except đầu tiên và câu lệnh print(“Bien chua duoc dinh nghia”) sẽ được thực thi bên trong.
  • Nếu chương trình không phải do lỗi NameError thì một Except thứ hai sẽ được thực thi và khi đó câu lệnh print(“Da co mot loi khac trong chuong trinh”) được thực thi bên trong nhằm mục đích hiển thị một thông báo khác cho các lỗi khác.
  • Vì ở ở chương trình trên một biến x chưa được định nghĩa, nên gây ra lỗi NameError. Vì vậy mà Except đầu tiên sẽ được thực thi, nên ta có kết quả hiển thị là: “Bien chua duoc dinh nghia”

2.3 Xử lý ngoại lệ với IF trong Python

Trong Python, bạn có thể sử dụng câu lệnh IF để kiểm tra một điều kiện bất kỳ, kết quả kiểm tra điều kiện này có thể là True/False và bạn hoàn toàn có thể vận dụng linh hoạt câu lệnh IF để trả về một ngoại lệ thông qua từ khóa raise có sẵn trong Python.

Ví dụ dưới đây, sử dụng câu lệnh IF kết hợp với từ khóa raise để kiểm tra điều kiện và trả về một Exception nếu như giá trị của biến x nhỏ hơn 0

# Khai bao x bang -1
x = -1

# Neu x nho hon 0
if x < 0:
    # Tra ve ngoai le bang tu khoa raise
    raise Exception("Ngoai le! So nay khong duoc nho hon 0!")

Kết quả:

Traceback (most recent call last):
  File "c:\Users\Administrator\Desktop\python ex\main.py", line 7, in <module>
    raise Exception("Ngoai le! So nay khong duoc nho hon 0!")
Exception: Ngoai le! So nay khong duoc nho hon 0!

Ví dụ tiếp theo, xử lý ngoại lệ bằng cách sử dụng câu lệnh IF kiểm tra điều kiện của biến x. Nếu biến x không mang kiểu dữ liệu int thì sẽ sử dụng từ khóa raise để trả về một kiểu lỗi TypeError

# Khai bao x kieu string
x = "hello"

# Neu x khong la kieu int
if not type(x) is int:
    # Tra ve kieu loi
    raise TypeError("Chi cho phep kieu int")

Kết quả:

Traceback (most recent call last):
  File "c:\Users\Administrator\Desktop\python ex\main.py", line 7, in <module>
    raise TypeError("Chi cho phep kieu int")
TypeError: Chi cho phep kieu int

3. Try…Except…Else…Finally trong Python

3.1 Try…Except…Else trong Python

Bạn có thể sử dụng từ khóa Else để xác định một khối mã sẽ được thực thi nếu không có lỗi nào được phát sinh trong cả câu lệnh Try…Except 

Ví dụ dưới đây, các câu lệnh bên trong từ khóa Else sẽ được thực thi với trường hợp không có lỗi nào được gây ra trong quá trình thực thi chương trình.

# Khai bao bien x
x = 5

try:
    # Thu in ra bien x
    print(x)
except: # Neu trong Try gay ra loi
    print("Ton tai loi chuong trinh!")
else: # Truong hop chuong trinh khong ton tai loi
    print("Chuong trinh khong ton tai loi!")

Kết quả:

5
Chuong trinh khong ton tai loi!

3.2 Try…Except…Finally trong Python

Trong trường hợp, chúng ta mong muốn rằng sẽ thực thi một câu lệnh kể cả khi chương trình đó có tồn tại hoặc không tồn tại lỗi chương trình. Khi đó ta cần sử dụng đến câu lệnh Finally – khi câu lệnh này được khai báo, sẽ được thực thi các đoạn lệnh bên trong mặc dù bất kể khối Try có gây ra lỗi hay không gây ra lỗi.

Ví dụ dưới đây, thực thi câu lệnh bên trong khối Finally bất kể chương trình có tồn tại lỗi hay không tồn tại lỗi.

try:
    # Thu in ra x
    print(x)
except: # Neu trong Try co loi
    print("Bien chua duoc dinh nghia")
finally: # Thuc thi cau lenh du co loi hay khong co loi
  print("Hello World")

Kết quả:

Bien chua duoc dinh nghia
Hello World