Bài 28. Ngoại lệ

Read Time:4 Minute, 26 Second

Một chương trình python sẽ dừng lại ngay khi nó gặp lỗi nếu chưa được khắc phục. Những lỗi này có thể được phân thành 2 loại:

  • Lỗi cú pháp
  • Lỗi logic (Ngoại lệ)

Lỗi cú pháp

Lỗi do không tuân theo cấu trúc (cú pháp) của ngôn ngữ được gọi là lỗi cú pháp (syntax error) hoặc lỗi phân tích cú pháp (parsing error).

Ví dụ:

print(hello world!)

Khi chạy chương trình sẽ báo lỗi:

Traceback (most recent call last):
  File "C:\...\main.py", line 1
    print(hello world!)
                    ^
SyntaxError: invalid syntax

Chương trình phát sinh lỗi ở dòng 1, vị trí trong hàm print (xâu “hello world!” chưa có dấu nháy mở-đóng xâu)

Lỗi logic (ngoại lệ – exceptions)

Các lỗi xảy ra khi chạy chương trình (sau khi vượt qua kiểm tra cú pháp) được gọi là ngoại lệ (exceptions) hoặc lỗi lôgic (logical errors).

Ví dụ, lỗi sẽ phát sinh khi ta mở một file không tồn tại (FileNotFoundError),khi ta thực hiện phép chia cho 0 (ZeroDivisionError), khi ta import một module không tồn tại (ImportError),…

Bất cứ khi nào các loại lỗi logic (runtime error) xảy ra, Python sẽ phát sinh một đối tượng ngoại lệ. Nếu không được xử lý đúng cách, chương trình sẽ in thông báo lỗi cùng với một số chi tiết về lý do tại sao lỗi đó xảy ra.

Xem xét ví dụ sau:

a = 1 / 0

Chạy chương trình sẽ nhận được thông báo sau:

Traceback (most recent call last):
  File "C:\...\main.py", line 1, in <module>
    a = 1 / 0
ZeroDivisionError: division by zero

Ví dụ về lỗi mở file không tồn tại:

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ệ tích hợp sẵn (built-in exceptions)

Hoạt động không hợp lệ sẽ sinh ngoại lệ. Có rất nhiều ngoại lệ tích hợp sẵn trong Python được gọi ra khi các lỗi tương ứng xảy ra. Ta có thể xem tất cả các ngoại lệ được tích hợp sẵn bằng cách sử dụng hàm local() được tích hợp sẵn như sau:

print(dir(locals()['__builtins__']))

Một số ngoại lệ tích hợp sẵn phổ biến trong Python cùng với lỗi gây ra chúng được liệt kê dưới đây:

Ngoại lệLý do gây ra
AssertionErrorXảy ra khi câu lệnh assert thất bại.
AttributeErrorXảy ra khi gán thuộc tính hoặc tham chiếu thất bại.
EOFErrorXảy ra khi hàm input () chạm vào điều kiện end-of-file.
FloatingPointErrorXảy ra khi một số thực dấy phẩy động thực thi không thành công
GeneratorExitXảy ra khi phương thức close() của hàm generator được gọi.
ImportErrorXảy ra khi không tìm thấy module được import.
IndexErrorXảy ra khi một chỉ số trong chuỗi (sequence) nằm ngoài phạm vi.
KeyErrorXả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ó.
KeyboardInterruptXảy ra khi người dùng nhấn phím ngắt (thông thường là Ctrl-C hoặc Delete).
MemoryErrorXả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).
NameErrorXảy ra khi không tìm thấy tên cục bộ hoặc toàn cầu của biến.
NotImplementedErrorXả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.
OSErrorXảy ra khi một hàm trả về lỗi liên quan đến hệ thống
OverflowErrorXả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.
ReferenceErrorXả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.
RuntimeErrorXả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.
StopIterationXả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.
SyntaxErrorXảy ra khi gặp lỗi cú pháp.
IndentationErrorXảy ra khi có lỗi thụt lề không chính xác.
TabErrorXảy ra khi thụt lề sử dụng các tab và dấu cách không nhất quán.
SystemErrorXả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.
SystemExitXảy ra bởi hàm sys.exit().
TypeErrorXả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.
UnboundLocalErrorXả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 đó.
UnicodeErrorXảy ra khi có lỗi liên quan đến Unicode
UnicodeEncodeErrorXảy ra khi lỗi liên quan đến Unicode diễn ra trong quá trình mã hóa.
UnicodeDecodeErrorXảy ra khi lỗi liên quan đến Unicode diễn ra trong quá trình giải mã.
UnicodeTranslateErrorXảy ra khi lỗi liên quan đến Unicode trong quá trình dịch.
ValueErrorXả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
ZeroDivisionErrorXảy ra khi đối số thứ hai của phép chia hoặc phép toán modulo bằng 0.

Chúng ta có thể xử lý các ngoại lệ bằng cách sử dụng câu lệnh try, except và finally (sẽ tìm hiểu trong bài học tiếp theo).

Happy
Happy
0 %
Sad
Sad
0 %
Excited
Excited
0 %
Sleepy
Sleepy
0 %
Angry
Angry
0 %
Surprise
Surprise
0 %

Average Rating

5 Star
0%
4 Star
0%
3 Star
0%
2 Star
0%
1 Star
0%

Trả lời

Previous post Bài 27. Quản lý file và folder
Next post Bài 29. Xử lý ngoại lệ