Hướng Dẫn Đầy Đủ Về Exception Trong Python Cập Nhật Mới Nhất 2021

Exception trong python

Ngoại lệ – Exception trong Python là gì?

Exception trong python là một sự kiện xảy ra trong quá trình thực thi một chương trình. Khi nó xảy ra, ứng dụng hoặc server của bạn có thể bị crash, khi đó Python sẽ tạo ra một exception để xử lý cho vấn đề đó.

Bất kỳ điều kiện bất thường nào trong chương trình làm gián đoạn luồng thực thi chương trình đó thì đều được coi là ngoại lệ. Bất kể khi nào xuất hiện một ngoại lệ, chương trình sẽ ngừng thực thi và chuyển qua quá trình gọi & in ra lỗi cho đến khi nó được xử lý.

Các lỗi exception trong Python có sẵn

Có hai kiểu lỗi:

– Syntax Error: Có tên gọi khác là Parsing Errors (lỗi phân tích cú pháp), đây là lỗi cơ bản nhất, xảy ra khi Python parser – trình phân tích cú pháp của Python – không thể hiểu được một dòng code cụ thể nào đó.

– Exception: Là những lỗi phát sinh trong quá trình chương trình thực thi, ví dụ như lỗi ZeroDivisionError – Lỗi chia cho 0.

Danh sách các các lỗi ngoại lệ (Exception Errors):

– IOError: Nếu không thể mở được file ra

– KeyboardInterrupt: Khi người dùng nhấp vào một phím không được yêu cầu

– ValueError: Khi built-in function (hàm được tích hợp sẵn  trong Python) nhận được một đối số sai (wrong argument)

– EOFError: Nếu đọc được ký tự kết thúc file (End-Of-File) mà trước đó không đọc được bất kỳ dữ liệu nào.

– ImportError: Nếu module đang được import vào chương trình không được tìm thấy.

Xử lý exception trong python với khối lệnh Try Except

Khối lệnh try…except được dùng để xử lý các exception trong python.

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

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

Ví dụ:

# Để gọi ra các ngoại lệ, dùng import module sys
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)

Màn hình đưa ra kết quả 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
Với phần tử 2, kết quả là: 0.5

Ở ví dụ này, cho đến khi số chính xác số được nhập là số nguyên, chương trình sẽ không dừng lại.

Nếu không có ngoại lệ xảy ra, chương trình sẽ thực thi theo luồng bình thường và khối except sẽ được bỏ qua, tuy nhiên 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.

Mệnh đề except không có ngoại lệ

Với cú pháp sau, bạn có thể sử dụng câu lệnh except không có phần bắt ngoại lệ:

try:
Khối lệnh nghi ngờ phát sinh ngoại lệ được đặt tại đây;
……………………………….
Khối lệnh tại đây sẽ được kích hoạt nếu có bất kỳ ngoại lệ nào;
……………………………….
Khối lệnh tại đây sẽ được kích hoạt nếu không có bất kỳ ngoại lệ nào;….

Tất cả các ngoại lệ có thể bị bắt xảy ra nếu sử dụng loại câu lệnh try – except như trên. Tuy nhiên với phương pháp lập trình này, lập trình viên không thể xác định được nguyên nhân gốc rễ của vấn đề, nên việc sử dụng nó không được coi trọng.

Mệnh đề except với nhiều ngoại lệ

Dùng cú pháp sau để sử dụng cùng một câu lệnh except mà vẫn có thể xử lý nhiều ngoại lệ:

try:
Khối lệnh nghi ngờ phát sinh ngoại lệ được đặt tại đây;
……………………………….
except (Exceptional, Exception2, …, ExceptionN):
Nếu có bất kỳ ngoại lệ nào trong danh sách ngoại lệ ở trên thì khối lệnh tại đây sẽ được kích hoạt;
……………………………….
Nếu không có bất kỳ ngoại lệ nào thì khối lệnh tại đây sẽ được kíc
h hoạt;….

Xử lý exception trong python với khối lệnh Try Except Finally

Một cách khác để viết lệnh try trong Python đó là dùng Try…finally.
Finally còn được gọi là mệnh đề clean-up/termination vì dù cho có bất kể lỗi nào xảy ra trong block try thì nó vẫn luôn luôn chạy.

Chức năng chính của các câu lệnh trong finally là dùng để giải phóng tài nguyên.

Để có cái nhìn rõ hơn về finally, ta có ví dụ cho các hoạt động của file sau:
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. Việc này giúp đả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, ngay cả khi chương trình dừng đột ngột do phát sinh ngoại lệ, ta có thể yên tâm file được đóng đúng cách.
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.")

Bất kể có lỗi xảy ra hay không, Finally luôn luôn chạy.
Khi input bạn nhập vào là 5, kết quả hiển thị ra là:

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, chương trình sẽ trả về kết quả:

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.

Cách xây dựng một exception riêng trong python

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

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ệ XD'

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, các lệnh print trong các except block sẽ được thực hiện nếu bạn nhập một số bên ngoài các phạm vi cho phép.

Module traceback

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

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.

Vậy là MCI đã giới thiệu cho bạn tổng quan về các cách cơ bản để xử lý ngoại lệ trong Python. Mong rằng bài viết sẽ giúp các bạn tích lũy thêm những hiểu biết nhất định về Python.

Bạn cũng có thể tham khảo thêm về khoá học Python cơ bản đến nâng cao tại MCI để tìm cho mình lộ trình học hiệu quả hơn nhé.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *