Bài 29. Ngoại lệ
Lỗi và ngoại lệ trong Python
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ụ:
Khi chạy chương trình sẽ báo lỗi:
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:
Chạy chương trình sẽ nhận được thông báo sau:
Ví dụ về lỗi mở file không tồn tại:
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:
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
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.
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).
Last updated