Xử lý ngoại lệ – Exception Handling trong Python

Trong bài viết này, chúng tôi sẽ cùng bạn tìm hiểu cách xử lý các ngoại lệ trong Python bằng cách sử dụng các câu lệnh Try, Except và Finally. Điều này sẽ thúc đẩy bạn viết code gọn gàng, dễ đọc và hiệu quả bằng Python.

Nội dung chính

  • Ngoại lệ (Exception) trong Python
  • Xử lý ngoại lệ trong Python
  • Xử lý cụ thể một ngoại lệ
  • Xây dựng một Exception
  • Try…Finally

Ngoại lệ (Exception) trong Python

Ngoại lệ (Exception) là lỗi xảy ra trong quá trình thực thi một chương trình. Khi nó xảy ra, Python tạo ra một exception để xử lý vấn đề đó tránh cho ứng dụng hay server của bạn bị crash.

Ngoại lệ có thể là bất kỳ điều kiện bất thường nào trong chương trình phá vỡ luồng thực thi chương trình đó. Bất cứ khi nào 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ý.

Xử lý ngoại lệ trong Python

Trong Python, các ngoại lệ có thể được xử lý bằng khối lệnh try…except.

Phần thân của try sẽ gồm code có thể tạo ra exception, nếu một exception được tạo ra, tất cả câu lệnh trong khối sẽ bị bỏ qua.

Mặt khác, phần thân của except được gọi bởi exception handler, vì nó được dùng để bắt lỗi. Khối except sẽ thực hiện khi lỗi được tạo ra, không thì sẽ được bỏ qua. Bạn có thể dùng exception có sẵn trong Thư viện chuẩn Python đã được Quantrimang đề cập đến trong bài giới thiệu về Exception.

Ví dụ:

# import module sys để gọi ra các ngoại lệ
import sys

randomList = ['a', 0, 2]

for nhap in randomList:
try:
print("Phần tử:", nhap)
r = 1/int(nhap)
break
except:
print("Có ngoại lệ ",sys.exc_info()[0]," xảy ra.")
print("Nhập phần tử tiếp theo")
print()
print("Kết quả với phần tử",nhap,"là:",r)

Kết quả đưa ra màn hình như sau:

Phần tử: a
Có ngoại lệ <class 'ValueError'> xảy ra.
Nhập phần tử tiếp theo

Phần tử: 0
Có ngoại lệ <class 'ZeroDivisionError'> xảy ra.
Nhập phần tử tiếp theo

Phần tử: 2
Kết quả với phần tử 2 là: 0.5

Ở ví dụ này, chương trình sẽ thực thi đến khi có chính xác số được nhập là số nguyên.

Nếu không có ngoại lệ xảy ra, khối except sẽ được bỏ qua và chương trình theo luồng bình thường, nhưng nếu có bất cứ ngoại lệ nào nó sẽ bị chặn lại bởi except.

Chương trình cũng in tên của exception bằng hàm ex_info() bên trong module sys, kết quả trả về là giá trị ‘a’ gây ra ValueError và 0 gây ra ZeroDivisionError

Xử lý cụ thể một ngoại lệ

Ở ví dụ trên, không có một ngoại lệ cụ thể nào được đề cập đến trong mệnh đề except nên khi chương trình gặp ngoại lệ (dù là bất kì exception nào) thì chúng đều được xử lý theo một cách.

Ngoài cách đó ra, ta có thể chỉ định các ngoại lệ cụ thể cho khối lệnh except.

Cú pháp như sau:

try:
# khối code lệnh try
except exceptionName:
# khối code lệnh except

Tham số:

  • exceptionName là tên của các exception bạn nghĩ có khả năng xảy ra.

Một mệnh đề try có thể có nhiều mệnh đề except để xử lý chúng khác nhau.

Nếu khối lệnh trong try có 1 lỗi gì đó xảy ra thì chương trình sẽ tìm đến các except phía dưới, except nào thỏa mãn thì nó sẽ thực thi code trong khối except đó.

try :
# khối code lệnh try

except ValueError:
# code xử lý ValueError

except RuntimeError:
# code xử lý RuntimeError

Bạn cũng có thể bắt nhiều exception trên một lần khai báo except bằng việc đặt các ngoại lệ cách nhau bởi một dấu phẩy ‘,’

try :
# khối code lệnh try

except (TypeError, ZeroDivisionError):
# code xử lý nhiều ngoại lệ
# TypeError, ZeroDivisionError

Xây dựng một Exception

Xây dựng một exception bằng cách sử dụng raise là một cách khác để xử lí ngoại lệ trong Python. Trong trường hợp này, bạn có thể tạo exception của riêng mình – đó là exception được nêu ra khi vấn đề nằm bên ngoài phạm vi của dự kiến lỗi xảy ra.

Ví dụ:

try:
x = input('Nhập một số trong khoảng 1-10: ')
if x<1 or x>10:
raise Exception
print 'Bạn vừa nhập một số hợp lệ :D'

except:
print 'Số bạn vừa nhập nằm ngoài khoảng cho phép mất rồi!'

Trong ví dụ này, nếu bạn nhập một số bên ngoài các phạm vi cho phép, các lệnh print trong các except block sẽ được thực hiện.

Module traceback

Module traceback là cách khác để xử lí exception trong Python. Về cơ bản nó được sử dụng để in ra dấu vết của chương trình sau khi exception xảy ra.

Traceback bao gồm thông báo lỗi, số dòng gây ra lỗi và call stack của hàm gây ra lỗi.

>>> raise KeyboardInterrupt
Traceback (most recent call last):
File "<pyshell#0>", line 1, in <module>
raise KeyboardInterrupt
KeyboardInterrupt

>>> raise MemoryError("Đây là một tham số.")
Traceback (most recent call last):
File "<pyshell#1>", line 1, in <module>
raise MemoryError("Đây là một tham số.")
MemoryError: Đây là một tham số.

>>> try:
... a = int(input("Nhập một số nguyên dương: "))
... if a <= 0:
... raise ValueError("Số bạn vừa nhập không phải số nguyên dương.")
... except ValueError as ve:
... print(ve)
...
Nhập một số nguyên dương: -2
Số bạn vừa nhập không phải số nguyên dương.

Try…Finally

Try…finally là một cách khác để viết lệnh try trong Python.

Finally còn được gọi là mệnh đề clean-up/termination vì nó luôn luôn chạy bất kể có lỗi nào xảy ra trong block try.

Thường thì các câu lệnh trong finally được dùng để thực hiện công việc giải phóng tài nguyên.

Ví dụ cho các hoạt động của file để minh họa rõ về finally:

Sau khi thực hiện xong các thao tác với file trong Python thì bạn cần đóng nó lại. Đóng file để đảm bảo quy chế đóng mở và giải phóng bộ nhớ cho chương trình.

try:
f = open("test.txt",encoding = 'utf-8')
# thực hiện các thao tác với tệp
finally:
f.close()

Bằng cách này, ta có thể yên tâm file được đóng đúng ngay cả khi phát sinh ngoại lệ khiến chương trình dừng đột ngột.

Một ví dụ khác có ngoại lệ:

mauso = input("Bạn hãy nhập giá trị mẫu số: ")
try:
ketqua = 15/int(mauso)
print("Kết quả là:",ketqua)
finally:
print("Bạn đã nhập số không thể thực hiện phép tính.")

Finally luôn luôn chạy bất kể có lỗi xảy ra hay không.

Khi bạn nhập input là 5, chương trình trả về kết quả:

Bạn hãy nhập giá trị mẫu số: 5
Kết quả là: 3.0
Bạn đã nhập số không thể thực hiện phép tính.

Và khi input là 0, kết quả hiển thị:

Bạn hãy nhập giá trị mẫu số: 0
Bạn đã nhập số không thể thực hiện phép tính.

Vậy là chúng tôi đã giới thiệu cho bạn xong về các cách cơ bản để xử lý ngoại lệ trong Python rồi.

Leave a Reply