Trong bài viết này, chúng ta sẽ tìm hiểu về cách xử lý các ngoại lệ trong ngôn ngữ lập trình Python bằng cách sử dụng các câu lệnh Try, Except và Finally. Qua đó, bạn sẽ có khả năng viết mã nguồn sạch sẽ, dễ đọc và hiệu quả.
Ngoại lệ (Exception) trong Python
Ngoại lệ (Exception) là các lỗi xảy ra trong quá trình thực thi của một chương trình. Khi một ngoại lệ xảy ra, Python tạo ra một exception để xử lý vấn đề đó và tránh crash ứng dụng hoặc server của bạn.
Ngoại lệ có thể là bất kỳ điều kiện ngoại lệ nào 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ẽ dừng thực thi, chuyển tới quá trình gọi và in ra lỗi cho đến khi nó được xử lý.
Xử lý ngoại lệ trong Python
Trong Python, chúng ta có thể xử lý ngoại lệ bằng khối lệnh try...except. Khối try chứa mã có thể gây ra exception, nếu một ngoại lệ xảy ra, tất cả các lệnh trong khối sẽ bị bỏ qua.
Ngược lại, khối except được gọi bởi exception handler và được sử dụng để xử lý lỗi. Khối except sẽ được thực thi khi một lỗi xảy ra, nếu không, nó sẽ được bỏ qua. Bạn cũng có thể sử dụng các exception có sẵn trong thư viện chuẩn Python.
Ví dụ:
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ệ xảy ra.
Nhập phần tử tiếp theo
Phần tử: 0
Có ngoại lệ 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
Trong ví dụ này, chương trình sẽ thực hiện đến khi có một số nguyên được nhập. Nếu không có ngoại lệ xảy ra, khối except sẽ được bỏ qua và chương trình sẽ tiếp tục thực hiện bình thường. Tuy nhiên, nếu có bất kỳ ngoại lệ nào xảy ra, chúng sẽ được chặn lại bởi except.
Chương trình cũng in ra tên của exception sử dụng hàm exc_info() 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ệ
Trong ví dụ trên, không có ngoại lệ cụ thể nào được đề cập trong mệnh đề except, nên khi chương trình gặp ngoại lệ (dù là bất kỳ exception nào), chúng sẽ được xử lý theo cách giống nhau.
Tuy nhiên, chúng ta cũng 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
Trong đó:
exceptionName
là tên của các exception bạn nghĩ có thể xảy ra.
Một mệnh đề try có thể có nhiều mệnh đề except để xử lý các ngoại lệ khác nhau.
Nếu khối lệnh trong try có một lỗi xảy ra, chương trình sẽ tìm đến các except phía dưới. Mệnh đề except nào thỏa mãn, chương trình sẽ thực thi code trong khối except đó.
Bạn cũng có thể bắt nhiều exception trên một lần khai báo except bằng cách đặt các ngoại lệ cách nhau bằng 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 từ khóa 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 dự kiến.
Ví dụ:
try:
x = int(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!')
Trong ví dụ này, nếu bạn nhập một số nằm ngoài các phạm vi cho phép, các lệnh print trong khối except sẽ được thực hiện.
Module traceback
Module traceback
là một cách khác để xử lý exception trong Python. Nó được sử dụng để in ra dấu vết của chương trình sau khi xảy ra exception. Dấu vết bao gồm thông báo lỗi, số dòng tạo ra lỗi và call stack của hàm gây ra lỗi.
>>> raise KeyboardInterrupt
Traceback (most recent call last):
File "", line 1, in
raise KeyboardInterrupt
KeyboardInterrupt
>>> raise MemoryError("Đây là một tham số.")
Traceback (most recent call last):
File "", line 1, in
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. Mệnh đề finally, còn được gọi là mệnh đề clean-up/termination, luôn luôn chạy bất kể có lỗi nào xảy ra trong khối try.
Thường thì các câu lệnh trong finally được sử 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, 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, bạn có thể yên tâm rằng file sẽ đượ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:
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.")
Mệ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 sẽ 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 ta đã được giới thiệu về các cách cơ bản để xử lý ngoại lệ trong ngôn ngữ lập trình Python. Hy vọng bài viết sẽ mang lại kiến thức hữu ích cho bạn.
Bạn có thể kiểm tra ngay kiến thức của mình qua Bài kiểm tra trắc nghiệm Python về xử lý ngoại lệ của chúng tôi. Và đừng quên ôn tập thường xuyên với bài tập Python cùng Quantrimang nhé!
Bài trước: Error và Exception trong Python Bài tiếp: Lập trình hướng đối tượng trong Python