10 loại lỗi Python phổ biến và cách giải quyết chúng

Spread the love

Là một lập trình viên, bạn chắc chắn sẽ gặp lỗi khi phát triển phần mềm. Điều này có thể bao gồm từ lỗi logic dẫn đến kết quả không mong muốn, lỗi phát sinh do vi phạm các quy tắc của ngôn ngữ lập trình, thậm chí lỗi phát sinh khi chạy chương trình của bạn, trong số nhiều lỗi khác. Những lỗi này thường được gọi là bug.

Lỗi có mặt khắp nơi trong mọi ngôn ngữ lập trình bất kể nó dễ học hay sử dụng ngôn ngữ đó như thế nào.

Ví dụ, trong Python, mặc dù ngôn ngữ này nhấn mạnh đến khả năng đọc, tuân theo một cú pháp biểu cảm và được coi là tương đối dễ học và sử dụng so với các ngôn ngữ lập trình khác, nhưng bạn vẫn không tránh khỏi các lỗi lập trình khi sử dụng Python.

Vì các lỗi chắc chắn sẽ phát sinh, nên một cách tốt để giải quyết chúng là tìm hiểu về các loại lỗi khác nhau có thể xảy ra và cách chúng xảy ra. Điều này cho phép bạn tránh hoặc giảm thiểu các lỗi này trong khi lập trình và cũng biết cách xử lý chúng khi chúng phát sinh.

Dưới đây là một số lỗi Python phổ biến mà bạn có thể gặp phải khi lập trình bằng ngôn ngữ này:

Lỗi cú pháp

Lỗi cú pháp là lỗi phát sinh khi bạn viết mã vi phạm các quy tắc của ngôn ngữ lập trình mà bạn đang sử dụng. Điều này dẫn đến một dòng mã không hợp lệ.

Ví dụ, trong Python, khi in ra một chuỗi, nó cần được đặt trong dấu ngoặc kép. Không làm như vậy sẽ dẫn đến lỗi Cú pháp.

Lỗi cú pháp cũng có thể phát sinh khi bạn bỏ lỡ dấu ngoặc đơn mở hoặc đóng, dấu ngoặc vuông hoặc dấu ngoặc nhọn, viết sai chính tả từ khóa hoặc tên hàm, bỏ sót dấu hai chấm ở cuối câu lệnh điều khiển luồng hoặc khi bạn bỏ sót các toán tử bắt buộc trong biểu thức.

Nói chung, các lỗi cú pháp sẽ phát sinh nếu bạn vi phạm quy tắc về cách viết mã Python.

## syntax error arising from missing quotation mark
## around the string being printed
print("Hello World)

age = 20
## Syntax error arising from missing colon in an if statement
if age > 18
    print("Age is over 18")

## Syntax error because '(' was never closed
def square(x:
    return x * x
print(square(4))

Khi chạy đoạn mã trên, bạn sẽ gặp thông báo lỗi như hình bên dưới:

Thông báo lỗi khi chạy mã như sau:

  File "/home/madici/Desktop/helloworld.py", line 1
    print("Hello World)
          ^
SyntaxError: unterminated string literal (detected at line 1)

Để giải quyết những lỗi này, hãy sử dụng đúng cú pháp Python như hình bên dưới:

print("Hello World")

age = 20
if age > 18:
    print("Age is over 18")

def square(x):
    return x * x
print(square(4))

Lỗi thụt đầu dòng

Không giống như các ngôn ngữ khác như Java, C hoặc C++, sử dụng dấu ngoặc nhọn để phân tách các khối mã, Python sử dụng dấu thụt đầu dòng để xác định cấu trúc phân cấp và cấu trúc của các khối mã. Chẳng hạn, khi viết các câu lệnh điều khiển trong Java, tất cả mã sẽ được thực thi sau khi điều kiện đã được đánh giá được chứa bên trong dấu ngoặc nhọn.

Tuy nhiên, trong Python, khối mã sẽ được thụt vào. Một vết lõm điển hình trong Python bao gồm bốn khoảng trắng hoặc một tab. Tuy nhiên, số lượng khoảng trắng không quan trọng miễn là nó nhất quán trong suốt đoạn mã được viết.

Là một lập trình viên Python, bạn có thể gặp lỗi thụt lề khi không thêm được thụt đầu dòng cần thiết, chẳng hạn như khi viết các câu lệnh hoặc hàm điều khiển, khi bạn sử dụng cả tab và dấu cách để tạo thụt đầu dòng vì nó gây nhầm lẫn cho trình thông dịch, khi bạn đặt các dấu đầu dòng ở sai vị trí hoặc khi các vết lõm của bạn không nhất quán trong toàn bộ cơ sở mã của bạn.

  Cách cập nhật Chromebook của bạn một cách dễ dàng

Một ví dụ về mã dẫn đến lỗi thụt lề được hiển thị bên dưới:

age = 20
if age > 18:
print("Age is greater than 18")
   print("You're allowed to drive")
else:
    print("Age is less than 18")

Các thông báo lỗi do mã ở trên được hiển thị bên dưới:

Thông báo lỗi khi chạy mã như sau:

  File "/home/madici/Desktop/helloworld.py", line 3
    print("Age is greater than 18")
    ^
IndentationError: expected an indented block after 'if' statement on line 2

Để sửa lỗi, cần phải thụt lề dòng sau câu lệnh if dưới dạng thụt đầu dòng và đảm bảo nó khớp với phần thụt lề trong phần còn lại của mã như minh họa bên dưới:

age = 20
if age > 18:
   print("Age is greater than 18")
   print("You're allowed to drive")
else:
   print("Age is less than 18")

LoạiLỗi

Trong Python, TypeError là một ngoại lệ phát sinh khi bạn cố gắng thực hiện một thao tác bằng kiểu dữ liệu không tương thích. Chẳng hạn, nếu bạn cố gắng thêm một chuỗi và một số nguyên hoặc nối một kiểu dữ liệu chuỗi với một số nguyên, bạn sẽ gặp lỗi TypeError.

Bạn cũng có thể gặp TypeErrors khi bạn sử dụng các hàm hoặc phương thức có kiểu dữ liệu không chính xác, khi bạn cố gắng sử dụng một chỉ mục không phải số nguyên để truy cập các mục trong một danh sách có thể lặp lại, chẳng hạn như một danh sách hoặc khi bạn cố gắng lặp qua một đối tượng không thể lặp lại được.

Nói chung, bất kỳ thao tác nào sử dụng loại dữ liệu không chính xác sẽ dẫn đến TypeError.

Ví dụ về các hoạt động có thể dẫn đến TypeErrors được hiển thị bên dưới:

# Type Error resulting from concatenating a string an an integer
age = 25
message = "I am " + age + " years old."


list1 = [1, "hello", 5, "world", 18, 2021]
#Type errors resulting from wrong usage of builtin in methods
print(sum(list1))

#TypeError resulting from adding a string and an integer
num1 = 10
num2 = "16"
print(num1 + num2)

#TypeError resulting from using a non integer index
list2 = ["hello", "from", "the", "other", "side"]
print(list2["1"])

Các thông báo lỗi do mã ở trên hiển thị được hiển thị bên dưới:

Một thông báo TypeError mẫu từ mã được hiển thị bên dưới:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    message = "I am " + age + " years old."
              ~~~~~~~~^~~~~
TypeError: can only concatenate str (not "int") to str

Để xóa lỗi, hãy sử dụng đúng loại dữ liệu hoặc loại chuyển đổi như hình bên dưới:

age = 25
message = "I am " + str(age) + " years old."

list1 = [1, 5, 18, 2021]
print(sum(list1))

num1 = 10
num2 = "16"
print(num1 + int(num2))

list2 = ["hello", "from", "the", "other", "side"]
print(list2[1])

Lỗi thuộc tính

Trong Python, AttributeError xảy ra khi bạn cố gắng sử dụng một thuộc tính không tồn tại trên đối tượng hoặc gọi một phương thức không tồn tại trên đối tượng mà nó đang được gọi. AttributeError chỉ ra rằng một đối tượng không có thuộc tính hoặc phương thức đang được gọi trên nó.

Chẳng hạn, nếu bạn gọi một phương thức chuỗi trên một số nguyên, bạn sẽ gặp AttributeError vì phương thức này không tồn tại trên loại đối tượng mà bạn đang gọi nó.

Trong ví dụ hiển thị bên dưới, phương thức vốn hoa (), được sử dụng để chuyển đổi chữ cái đầu tiên của chuỗi thành chữ hoa, đang được gọi trên một số nguyên. Kết quả là lỗi thuộc tính vì int không có phương thức viết hoa().

# AttributeError arising from calling capitalize() on an int value
num = 1445
cap = num.capitalize()
print(cap)

Chạy mã này dẫn đến thông báo lỗi hiển thị bên dưới:

Thông báo AttributeError từ mã như sau:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    cap = num.capitalize()
          ^^^^^^^^^^^^^^
AttributeError: 'int' object has no attribute 'capitalize'

Để giải quyết AttributeError, hãy đảm bảo rằng phương thức hoặc thuộc tính bạn đang gọi tồn tại trên loại đối tượng mà bạn đang gọi nó. Trong trường hợp này, gọi vốn hóa () trên kiểu dữ liệu chuỗi sẽ giải quyết lỗi này như hình bên dưới:

Nhập Lỗi

ImportError trong Python xảy ra khi bạn cố gắng nhập một mô-đun không thể tìm thấy hoặc không thể truy cập được trong môi trường hiện tại của bạn. Có thể là nó chưa được cài đặt, bạn chưa định cấu hình đúng đường dẫn của nó hoặc bạn đã viết sai chính tả mô-đun mà bạn đang cố cài đặt.

  Cách chia sẻ tệp Google Tài liệu, Trang tính hoặc Trang trình bày dưới dạng Trang Web

Một ImportError có một lớp con duy nhất được gọi là ModuleNotFoundError, đây là lỗi được đưa ra khi bạn cố gắng nhập một mô-đun không thể tìm thấy.

Chẳng hạn, đoạn mã dưới đây khi cố gắng nhập thư viện phân tích dữ liệu pandas sẽ gây ra lỗi như vậy vì mô-đun chưa được cài đặt.

Thông báo ImportError được tạo ra được hiển thị bên dưới:

  File "/home/madici/Desktop/helloworld.py", line 1, in <module>
    import pandas
ModuleNotFoundError: No module named 'pandas'

Để giải quyết lỗi như vậy, hãy đảm bảo rằng các mô-đun bạn đang cố gắng nhập đã được cài đặt. Trong trường hợp cách đó không giải quyết được lỗi, hãy kiểm tra xem bạn có đang sử dụng đúng chính tả cho mô-đun và đường dẫn tệp chính xác để truy cập mô-đun hay không.

Giá trịError

Đây là một ngoại lệ xảy ra khi một hàm trong Python nhận được một giá trị của kiểu dữ liệu chính xác nhưng giá trị đó lại là một giá trị không phù hợp. Chẳng hạn, hàm Math.sqrt() được sử dụng để tìm căn bậc hai của các giá trị số sẽ trả về ValueError nếu bạn chuyển vào một số âm.

Nhiều như giá trị sẽ thuộc loại chính xác, đó là một giá trị số, âm làm cho nó trở thành một giá trị không phù hợp cho

Hàm int() chuyển đổi một số hoặc một chuỗi sẽ trả về ValueError nếu bạn chuyển vào một chuỗi không phải là giá trị chuỗi số. Việc chuyển “123” hoặc “45” cho hàm không trả về lỗi vì các chuỗi có thể được chuyển đổi thành giá trị số nguyên thích hợp.

Tuy nhiên, nếu bạn chuyển vào một chuỗi không phải là giá trị chuỗi số, chẳng hạn như “Xin chào”, nó sẽ trả về ValueError. Điều này là do “Xin chào” mặc dù là một chuỗi nhưng không phù hợp vì nó không có số nguyên tương đương.

Một ví dụ về mã tạo ra ValueError được hiển thị bên dưới:

# Value error resulting from inappropriate int value in sqrt()
import math
num = -64
root = math.sqrt(num)
print(root)

# Value error resulting from passing a string with no integer
# equivalent into int() function
numString = "Hello"
num = int(numString)
print(num)

Các lỗi từ đoạn mã trên được hiển thị bên dưới:

Thông báo lỗi được tạo ra như sau:

  File "/home/madici/Desktop/helloworld.py", line 4, in <module>
    root = math.sqrt(num)
           ^^^^^^^^^^^^^^
ValueError: math domain error

Để sửa lỗi, hãy sử dụng các giá trị thích hợp trong các hàm như hình bên dưới:

import math
num = 64
root = math.sqrt(num)
print(root)

numString = "5231"
num = int(numString)
print(num)

Lỗi IO

IOError(Input/Output Error) là một ngoại lệ xảy ra khi thao tác nhập hoặc xuất không thành công. Điều này có thể do cố truy cập vào một tệp không tồn tại, không đủ bộ nhớ trong thiết bị của bạn, cố truy cập vào một tệp mà bạn không có đủ quyền truy cập hoặc khi bạn cố truy cập vào một tệp hiện đang được sử dụng bằng các thao tác khác.

Các phương thức như open(), read(), write() và close() thường được sử dụng khi làm việc với tệp là những phương thức có khả năng gây ra lỗi như vậy.

Hãy xem đoạn mã dưới đây cố mở một tệp có tên “notes.txt” không tồn tại. Đoạn mã dẫn đến IOError làm tăng FileNotFoundError:

Với thông báo lỗi sau:

  File "/home/madici/Desktop/helloworld.py", line 2, in <module>
    file1 = open("notes.txt", "r")
            ^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: 'notes.txt'

Để tránh lỗi ở trên, tất cả những gì bạn cần làm là đảm bảo tệp “notes.txt” tồn tại trong thư mục mà bạn đang chạy thiết bị đầu cuối. Một cách khác để xử lý IOErrors là sử dụng khối thử ngoại trừ, như minh họa bên dưới:

TênLỗi

NameError là một ngoại lệ mà bạn sẽ gặp phải khi cố gắng sử dụng một biến, hàm hoặc mô-đun không tồn tại, không được xác định trong phạm vi hiện tại hoặc chưa được gán giá trị.

  Kiểm tra Kiểm tra tốc độ trang trang web dành cho thiết bị di động

Một lỗi như vậy thường xảy ra khi bạn viết sai tên biến hoặc hàm hoặc sử dụng chúng trước khi chúng được xác định. Sử dụng một mô-đun mà không nhập nó cũng sẽ dẫn đến NameError.

Đoạn mã sau sẽ dẫn đến một ngoại lệ NameError:

# name error arises because the math module has not been imported
num = 64
root = math.sqrt(64)
print(root)

# NameError arises because x is used before it is defined
y = 23
print(x)

#NameEror because function name is not defined
def greet():
    print("Good morning")
great() #ameError: name 'great' is not defined

Các thông báo lỗi sau xuất phát từ đoạn mã trên:

Một thông báo NameError mẫu được hiển thị bên dưới:

  File "/home/madici/Desktop/helloworld.py", line 3, in <module>
    root = math.sqrt(64)
           ^^^^
NameError: name 'math' is not defined

Để giải quyết NameError như vậy, hãy đảm bảo rằng bạn không sử dụng các mô-đun trước khi nhập chúng, bạn không sử dụng các biến hoặc hàm trước khi xác định chúng và bạn không viết sai tên hàm hoặc tên biến:

import math
num = 64
root = math.sqrt(64)
print(root)

y = 23
print(y)

def greet():
    print("Good morning")
greet()

Chỉ mụcLỗi

IndexError là một ngoại lệ xảy ra khi bạn cố gắng truy cập một chỉ mục trong danh sách hoặc bộ nằm ngoài phạm vi. Hãy xem xét danh sách dưới đây:

list1 = [1, 2, 3, 4, 5]

Danh sách có năm yếu tố. Python đếm các chỉ mục từ 0 (không). Do đó, danh sách trên có chỉ số nằm trong khoảng từ 0 đến n-1, với n là số hoặc phần tử trong danh sách. Trong trường hợp này, chỉ mục hoặc danh sách sẽ nằm trong khoảng từ 0 đến 4.

Nếu bạn cố gắng truy cập một phần tử ở chỉ mục lớn hơn 4, bạn sẽ gặp phải Lỗi Index vì chỉ mục nằm ngoài phạm vi trong danh sách mà bạn đang cố gắng truy cập một phần tử từ đó. Đoạn mã dưới đây tạo ra một IndexError:

list1 = [1, 2, 3, 4, 5]
item = list1[6] #IndexError because the list index is out of range
print(item)

Lỗi từ mã được hiển thị bên dưới:

Thông báo IndexError được tạo như sau:

  File "/home/madici/Desktop/helloworld.py", line 2, in <module>
    item = list1[6] #IndexError because the list index is out of range
           ~~~~~^^^
IndexError: list index out of range

Cách tốt nhất để tránh IndexError là sử dụng các hàm range() và len() để đảm bảo bạn chỉ truy cập các phần tử nằm trong phạm vi như vậy:

list1 = [1, 2, 3, 4, 5]

for i in range(len(list1)):
    print(list1[i])

Lỗi chính

KeyError là một ngoại lệ xảy ra khi bạn cố gắng truy cập một mục từ từ điển bằng một khóa và không tìm thấy khóa trong từ điển. Hãy xem xét từ điển dưới đây:

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

Các phím trong từ điển là “Canada”, “USA”, “Italy”. Bạn có thể truy cập các mục từ từ điển thành phố bằng ba phím. Tuy nhiên, nếu bạn cố gắng truy cập một phần tử bằng cách sử dụng khóa không tồn tại, chẳng hạn như “Brazil”, bạn sẽ gặp lỗi KeyError, như minh họa bên dưới:

Thông báo KeyError được tạo được hiển thị bên dưới:

  File "/home/madici/Desktop/helloworld.py", line 6, in <module>
    print(cities["Brazil"])
          ~~~~~~^^^^^^^^^^
KeyError: 'Brazil'

Để giải quyết KeyError, hãy đảm bảo các khóa bạn đang sử dụng để truy cập các phần tử trong từ điển thực sự có trong từ điển. Để làm điều này, bạn có thể sử dụng câu lệnh if…else như sau:

cities = {"Canada": "Ottawa", "USA": "Washington", "Italy": "Rome"}

country = "Canada"

if country in cities:
    print("The capital city of " + country + " is " + cities[country])
else:
	print("The key " + country + " is not present in the cities dictionary")

Bằng cách này, bạn sẽ tránh gặp phải KeyErrors khi truy cập các phần tử từ từ điển

Phần kết luận

Khi viết mã bằng Python, bất kể trình độ chuyên môn của bạn như thế nào, bạn chắc chắn sẽ gặp lỗi. Do đó, hãy đảm bảo bạn đã làm quen với các loại lỗi khác nhau được nêu trong bài viết để đảm bảo bạn có thể xử lý chúng khi chúng phát sinh.

Bạn cũng có thể khám phá một số mẹo hữu ích trong Python để đơn giản hóa các tác vụ phổ biến.

x