2.1 Tạo ngoại lệ
Không thể đánh bại nó — hãy dẫn đầu. Nếu chúng ta không thể tránh sự xuất hiện của lỗi trong chương trình, chúng ta phải học cách kiểm soát chúng. Và để làm điều này, hãy học cách cố ý tạo ra các ngoại lệ.
Ví dụ đơn giản nhất về ngoại lệ — là chia cho không. Và chương trình cũng đơn giản:
x = 100 / 0
Mã này sẽ chạy với lỗi:
Traceback (most recent call last):
File "", line 1, in
x = 100 / 0
~~~^~
ZeroDivisionError: division by zero
ZeroDivisionError — là tên của ngoại lệ, còn division by zero — là mô tả ngắn gọn của nó. Python cũng sẽ thông báo số dòng mà ngoại lệ này xuất hiện.
Sai lệch kiểu dữ liệu
Dĩ nhiên, có thể xảy ra các ngoại lệ khác. Ví dụ, khi cố gắng cộng chuỗi và số:
s = "100" + 100
Sẽ xảy ra ngoại lệ TypeError:
Traceback (most recent call last):
File "", line 1, in
TypeError: unsupported operand type(s) for +: 'str' and 'int'
Vượt ngoài danh sách
Một lỗi rất phổ biến khác gây ra ngoại lệ — là cố gắng truy cập vào một phần tử không tồn tại trong danh sách:
my_list = [1, 2, 3]
print(my_list[10])
Sẽ xảy ra ngoại lệ IndexError:
Traceback (most recent call last):
print(my_list[10])
~~~~~~~^^^^
IndexError: list index out of range
Có bao nhiêu ngoại lệ tất cả? Có hàng ngàn loại ngoại lệ khác nhau. Hơn thế nữa, bạn có thể tự tạo ra những ngoại lệ của mình nếu cảm thấy những cái hiện có không đủ để mô tả một tình huống cụ thể nào đó. Tuy nhiên, không có nhiều ngoại lệ phổ biến.
2.2 Danh sách các ngoại lệ phổ biến nhất
Có nhiều ngoại lệ, nhưng với bạn là người mới bắt đầu, sẽ rất hữu ích để biết về những ngoại lệ phổ biến nhất. Dưới đây là bảng với chúng:
| Ngữ cảnh | Mô tả |
|---|---|
Exception |
Lớp cơ bản cho tất cả các ngoại lệ. |
IndexError |
Xảy ra khi truy cập vào chỉ số không tồn tại trong một dãy (ví dụ: danh sách hoặc bộ dữ liệu). |
KeyError |
Xảy ra khi truy cập vào một khóa không tồn tại trong từ điển. |
NameError |
Xảy ra khi truy cập vào một biến không tồn tại. |
RuntimeError |
Xảy ra khi một lỗi chung xảy ra trong quá trình chạy, không thuộc về các loại ngoại lệ khác. |
StopIteration |
Xảy ra để báo hiệu kết thúc của một vòng lặp. |
SyntaxError |
Xảy ra khi có lỗi cú pháp trong mã. |
IndentationError |
Xảy ra khi có lỗi thụt lề trong mã (một loại SyntaxError). |
TabError |
Xảy ra khi kết hợp tab và dấu cách cho thụt lề (một loại IndentationError). |
TypeError |
Xảy ra khi cố gắng thực hiện thao tác với các loại dữ liệu không tương thích. |
UnboundLocalError |
Xảy ra khi truy cập vào biến cục bộ trước khi nó được khai báo (một loại NameError). |
ValueError |
Xảy ra khi cung cấp cho một hàm hoặc thao tác một đối số có giá trị không đúng. |
ZeroDivisionError |
Xảy ra khi chia cho không. |
Có khả năng, bạn, như một người mới bắt đầu, sẽ gặp phải tất cả những lỗi này trong tháng đầu tiên của việc học. Và điều đó không có gì xấu — chỉ có học từ lỗi lầm.
2.3 Lỗi trong mã
Hãy xem xét thêm một vài tình huống khi mã gây ra lỗi, để bạn dễ dàng phát hiện hơn trong mã của mình:
IndentationError
Loại lỗi này xảy ra khi các thụt lề trong mã không đúng cách. Ví dụ, kết hợp tab và dấu cách hoặc số lượng thụt lề không đúng.
def example():
print("Hello")
print("World") # Sai thụt lề gây ra IndentationError
example()
NameError
def example():
print(undeclared_variable) # Cố gắng sử dụng biến chưa khai báo gây ra NameError
example()
ValueError
Loại lỗi này xảy ra khi thao tác hoặc hàm nhận một đối số có kiểu đúng nhưng giá trị không phù hợp.
def example():
int("abc") # Cố gắng chuyển đổi chuỗi không phải số gây ra ValueError
example()
KeyError
Loại lỗi này xảy ra khi chương trình cố gắng truy cập vào một khóa không tồn tại trong từ điển.
def example():
my_dict = {"a": 1, "b": 2}
print(my_dict["c"]) # Cố gắng truy cập vào khóa không tồn tại gây ra KeyError
example()
SyntaxError
Loại lỗi này xảy ra khi có lỗi cú pháp trong mã, tức là mã không tuân thủ ngữ pháp của ngôn ngữ Python.
def example():
eval("if True print('Hello')") # Sai cú pháp gây ra SyntaxError
example()
Ai được cảnh báo, người đó được trang bị. Giờ bạn có thể nhận ra và tạo ra các tình huống gây ra lỗi. Đây là lúc học cách xử lý các lỗi này.
GO TO FULL VERSION