Xử lý lỗi ngoại lệ trong Python (Try…Except)
Khi thực thi các dòng lệnh trong Python, các lỗi khác nhau có thể xảy ra do nhiều nguyên nhân: Lỗi trong quá trình viết code, lỗi do nhập liệu… Khi có lỗi xảy ra hệ thống sẽ dừng chương trình và đưa ra thông báo lỗi. Nếu chúng ta không muốn hành vi mặc định này, chúng ta cần phải xử lý các ngoại lệ.
Nội dung của bài
Khối lệnh try… except
Trong Python các ngoại lệ được xử lý bằng cách sử dụng khối lệnh try…except.
Python sẽ thực thi các dòng lệnh trong khối lệnh try như là một phần bình thường của chương trình.
Khi xảy ra lỗi trong quá trình thực thi, phần còn lại của khối lệnh sẽ được bỏ qua và khối lệnh except(ngoại lệ ) được thực hiện.
Ví dụ về try…except
try:
x = 10/0
except:
print('Something went wrong.')
# Prints Something went wrong.
Hoặc
def divide():
x = 1/0
try:
divide()
except Exception as e:
print(e)
# Prints division by zero
Xử lý nhiều exceptions
Chúng ta có thể cài đặt nhiều khối lệnh except để bắt từng ngoại lệ cụ thể.
try:
x = 1/0
except ZeroDivisionError:
print('Attempt to divide by zero')
except:
print('Something else went wrong')
# Prints Attempt to divide by zero
Ví dụ trên chúng ta có 2 khối lệnh except, khối lệnh một là để xử lý cho lỗi chia cho 0 và khối lệnh 2 là để xử lý cho các ngoại lệ khác.
Nếu chúng ta muốn xử lý chung 1 logic cho nhiều ngoại lệ thì có thể nhóm các ngoại lệ thành một tupe:
try:
x = 1/0
except (ZeroDivisionError, ValueError):
print('ZeroDivisionError or ValueError is raised')
except:
print('Something else went wrong')
# Prints ZeroDivisionError or ValueError is raised
Ở ví dụ trên chúng ta xử lý chung 1 logic cho 2 ngoại lệ ZeroDivisionError và ValueError.
Mệnh đề Else
Khối lệnh try…exept có thêm mệnh đề tùy chọn else. Mênh đề else chỉ thực thi khi không có ngoại lệ nào xảy ra.
try:
x = 10/2
except:
print('Something went wrong')
else:
print('Nothing went wrong')
# Prints Nothing went wrong
Mệnh đề Clause
Khối lện try…exept còn có một mệnh đề khác là finally.
try:
x = 100/0
except:
print('Something went wrong')
finally:
print('Always execute this')
# Prints Something went wrong
# Prints Always execute this
Sử dụng mệnh đề finally để xác định các hành động dọn dẹp phải được thực hiện như là close file.
try:
f = open('myfile.txt')
print(f.read())
except:
print("Something went wrong")
finally:
f. close()
Tự tạo một exception
Chúng ta hoàn toàn có thể xây dựng riêng một exception để xử lý một số logic cụ thể.
class InputError(Exception):
def __init__(self, value):
print("Input Error: " + value)
def divide(x, y):
if y == 0:
raise InputError('Mẫu phải khác 0')
return x/y
divide(10, 0)
# prints Input Error: Mẫu phải khác 0
Các exceptions mặc định trong Python
Exception Name | Chú Thích |
Exception | Đây là lớp cơ sở cho tất cả các exception, nó sẽ xuất hiện khi có bất cứ một lỗi nào xảy ra. |
StopIteration | Xuất hiện khi phương thức next() của interator không trỏ đến một đối tượng nào. |
SystemExit | Xuất hiện khi dùng phương thức sys.exit() |
StandardError | Lớp cơ sở cho tất cả các exception. |
ArithmeticError | Xuất hiện khi có lỗi tính toán giữa các số với nhau |
OverflowError | Xuất hiện khi thực hiện tính toán và giá trị của nó vượt quá ngưỡng giới hạn cho phép của kiểu dữ liệu. |
FloatingPointError | Xuất hiện khi tính toán float thất bại. |
ZeroDivisonError | Xuất hiện khi thực hiện phép chia cho 0. |
AssertionError | Xuất hiện trong trường hợp lệnh assert thất bại. |
AttributeError | Xuất hiện khi không tồn tại thuộc tính này, hoặc thiếu tham số truyền vào nó. |
EOFError | Xuất hiện khi không có dữ liệu từ hàm input() hoặc cuối file. |
ImportError | Xuất hiện khi lệnh import thất bại. |
KeyboardInterrupt | Xuất hiện khi ngắt trình biên dịch. |
LookupError | Lớp cơ sở cho tất cả các lỗi về lookup. |
IndexError | Xuất hiện khi index không tồn tại trong list, string,… |
KeyError | Xuất hiện khi key không tồn tại trong dictionary. |
NameError | Xuất hiện khi một biến không tồn tại trong phạm vi bạn gọi nó. |
EnvironmentError | Xuất hiện khi có bất kỳ một lỗi nào ngoài phạm vị của Python. |
IOError | Xuất hiện khi xử dụng input/ output thất bại, hoặc mở file không thành công. |
OSError | Xuất hiện khi có lỗi từ hệ điều hành. |
SyntaxError | Xuất hiện khi chương trình có lỗi cú pháp. |
IndentationError | Xuất hiện khi bạn thụt dòng không đúng. |
SystemError | Xuất hiện khi trình biên dịch có vấn đề nhưng mà nó lại không tự động exit. |
SystemExit | Xuất hiện khi trình biên dịch được thoát bởi sys.exit() . |
TypeError | Xuất hiện khi thực thi toán tử hoặc hàm mà kiểu dữ liệu bị sai so với kiểu dữ liệu đã định nghĩa ban đầu. |
ValueError | Xuất hiện khi chúng ta build 1 function mà kiểu dữ liệu đúng nhưng khi chúng ta thiết lập ở tham số là khác so với khi truyền vào. |
RuntimeError | Xuất hiện khi lỗi được sinh ra không thuộc một danh mục nào. |
NotImplementedError | Xuất hiện khi một phương thức trừu tượng cần được thực hiện trong lớp kế thừa chứ không phải là lớp thực thi |
UnboundLocalError | Xuất hiện khi chúng ta cố tình truy cập vào một biến trong hàm hoặc phương thức, nhưng không thiết lập giá trị cho nó. |
Tổng kết
Xử lý các ngoại lệ là một trong những kỹ năng rất quan trọng chúng ta cần có trong quá trình phát triển sản phẩm. Nhiều lập trình viên bỏ qua phần này, làm cho việc debug trở lên khó khăn. Các bạn hãy thực hành nhiều hơn nhé.
Great article thank you for sharing!