Python thường sinh ra các ngoại lệ (exception) khi có lỗi xảy ra trong quá trình thực thi. Quantrimang sẽ cùng bạn tìm hiểu về các ngoại lệ khác nhau được xây dựng trong ngôn ngữ này. Mời bạn đọc theo dõi.
Lỗi (Error)
Khi viết một chương trình, việc gặp lỗi thường xuyên là điều không thể tránh khỏi.
Có một số lỗi do không tuân theo cấu trúc đúng của cú pháp gây nên các lỗi lỗi cú pháp (syntax error hoặc parsing error).
>>> if a < 3
File "<interactive input>", line 1
if a < 3
^
SyntaxError: invalid syntax
Lệnh được viết trên bị thiếu dấu hai chấm trong câu lệnh IF lập tức chương trình báo lỗi cú pháp invalid syntax.
Ngoại lệ (Exception)
Ngoài ra, có trường hợp Python phát sinh lỗi khi đang thực thi chương trình (runtime error). Những lỗi này được gọi là ngoại lệ (Exception).
Ngoại lệ được Python tạo ra để xử lý vấn đề đó tránh cho chương trình bị hỏng.
Một số ví dụ về Exception như:
- Mở một tệp không tồn tại (FileNotFoundError)
- Chia một số cho 0 (ZeroDivisionError)
- Không tìm thấy module được import (ImportError).
- Truyền giá trị vào một function với đúng kiểu dữ liệu nhưng giá trị không thích hợp (ValueError).
Bất cứ khi nào có runtime error xảy ra, Python sẽ tạo một đối tượng ngoại lệ.
Nếu không được xử lý đúng cách, chương trình sẽ in ra lỗi và chi tiết về lý do có lỗi xảy ra.
>>> 1 / 0
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
ZeroDivisionError: division by zero
>>> open("imaginary.txt")
Traceback (most recent call last):
File "<string>", line 301, in runcode
File "<interactive input>", line 1, in <module>
FileNotFoundError: [Errno 2] No such file or directory: 'imaginary.txt'
Ngoại lệ được Python tạo ra
Có rất nhiều ngoại lệ được Python tạo ra khi gặp các lỗi tương ứng.
Bạn có thể xem tất cả các trường hợp Exception có sẵn bằng cách sử dụng hàm local() như sau:
locals()['__builtins__']
Hàm này sẽ trả về một danh sách các ngoại lệ, chức năng và thuộc tính được Python tích hợp sẵn.
Quantrimang xin giới thiệu một số ngoại lệ được xây dựng sẵn trong Python cùng với lỗi gây ra nó trong bảng dưới đây:
Ngoại lệ | Lý do gây ra |
AssertionError | Xảy ra khi câu lệnh assert thất bại. |
AttributeError | Xảy ra khi gán thuộc tính hoặc tham chiếu thất bại. |
EOFError | Xảy ra khi hàm input () chạm vào điều kiện end-of-file. |
FloatingPointError | Xảy ra khi một số thực dấy phẩy động thực thi không thành công |
GeneratorExit | Xảy ra khi phương thức close() của hàm generator được gọi. |
ImportError | Xảy ra khi không tìm thấy module được import. |
IndexError | Xảy ra khi một chỉ số trong chuỗi (sequence) nằm ngoài phạm vi. |
KeyError | Xảy ra khi không tìm thấy khóa ánh xạ (từ điển) trong tập hợp các khóa hiện có. |
KeyboardInterrupt | Xảy ra khi người dùng nhấn phím ngắt (thông thường là Ctrl-C hoặc Delete). |
MemoryError | Xảy ra khi một operation hết bộ nhớ nhưng tình huống vẫn có thể được sửa chữa (bằng cách xóa một số đối tượng). |
NameError | Xảy ra khi không tìm thấy tên cục bộ hoặc toàn cầu của biến. |
NotImplementedError | Xảy ra bằng các phương thức trừu tượng khi chúng yêu cầu các lớp dẫn xuất ghi đè phương thức. |
OSError | Xảy ra khi một hàm trả về lỗi liên quan đến hệ thống |
OverflowError | Xảy ra khi kết quả của phép toán số học quá lớn không thể biểu diễn. |
ReferenceError | Xảy ra khi một proxy tham chiếu yếu sử dụng để truy cập một thuộc tính của tham chiếu sau khi thu thập rác. |
RuntimeError | Xảy ra khi phát hiện thấy lỗi không thuộc bất kỳ danh mục nào khác. |
StopIteration | Xảy ra bằng phương thức next() của một vòng lặp để báo hiệu rằng không có giá trị nào được trả về bởi iterator. |
SyntaxError | Xảy ra khi gặp lỗi cú pháp. |
IndentationError | Xảy ra khi có lỗi thụt lề không chính xác. |
TabError | Xảy ra khi thụt lề sử dụng các tab và dấu cách không nhất quán. |
SystemError | Xảy ra khi trình thông dịch tìm thấy các lỗi nội bộ nhưng tình hình không quá nghiêm trọng. |
SystemExit | Xảy ra bởi hàm sys.exit(). |
TypeError | Xảy ra khi một hàm hoặc phép thực thi (operation) áp dụng kiểu không chính xác cho một đối tượng. |
UnboundLocalError | Xảy ra khi tham chiếu tạo thành một biến cục bộ trong một hàm hoặc phương thức, nhưng không có giá trị nào bị ràng buộc với biến đó. |
UnicodeError | Xảy ra khi có lỗi liên quan đến Unicode |
UnicodeEncodeError | Xảy ra khi lỗi liên quan đến Unicode diễn ra trong quá trình mã hóa. |
UnicodeDecodeError | Xảy ra khi lỗi liên quan đến Unicode diễn ra trong quá trình giải mã. |
UnicodeTranslateError | Xảy ra khi lỗi liên quan đến Unicode trong quá trình dịch. |
ValueError | Xảy ra khi một phép toán hoặc hàm nhận được một đối số có kiểu đúng nhưng giá trị không phù hợp |
ZeroDivisionError | Xảy ra khi đối số thứ hai của phép chia hoặc phép toán modulo bằng 0. |
Để xử lý những ngoại lệ này, bạn có thể sử dụng các câu lệnh try, except và finally.
Ngoài ra, bạn cũng có thể tự định nghĩa ngoại lệ của mình trong Python nếu cần thiết.
Hai vấn đề này sẽ được chúng ta tìm hiểu trong các bài viết tiếp theo.