Tin tức và phân tích của tất cả các thiết bị di động

10 loại lỗi Python thường gặp và cách giải quyết

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

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

Ví dụ, trong Python, mặc dù ngôn ngữ nhấn mạnh vào khả năng đọc, có 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, bạn vẫn không tránh khỏi các lỗi lập trình khi sử dụng Python.

Vì sai sót là điều không thể tránh khỏi nên cách tốt để giải quyết chúng là làm quen với các loại lỗi khác nhau có thể phát sinh và cách chúng phát sinh. Điều này cho phép bạn tránh hoặc giảm thiểu những lỗi này trong quá trình phát triển, cũng như biết cách xử lý chúng khi chúng xảy ra.

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 xảy ra khi bạn viết mã vi phạm các quy tắc của ngôn ngữ lập trình 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 một chuỗi, bạn phải đặt nó trong dấu ngoặc kép. Nếu 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ỏ qua dấu ngoặc đơn mở hoặc đóng, dấu ngoặc vuông hoặc dấu ngoặc nhọn, từ khóa hoặc tên hàm bị sai chính tả, dấu hai chấm bị bỏ qua ở cuối câu lệnh điều khiển luồng hoặc toán tử bắt buộc bị bỏ qua trong biểu thức.

Nói chung, lỗi cú pháp sẽ xảy ra nếu bạn vi phạm một 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))

Sau khi chạy đoạn mã trên, bạn sẽ nhận được thông báo lỗi như hình dưới đây:

Thông báo lỗi khi chạy code 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 các lỗi này, hãy sử dụng cú pháp python chính xác như dưới đây:

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 lề

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

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

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

Sau đây là ví dụ về mã gây ra lỗi thụt lề:

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 đoạn mã trên được hiển thị bên dưới:

Thông báo lỗi khi chạy code 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, hãy thụt dòng sau câu lệnh if làm mức thụt lề bắt buộc và đảm bảo rằng nó khớp với mức thụt lề của phần còn lại của mã, như 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")

Lỗi gõ

Trong Python, TypeError là một ngoại lệ xảy ra khi bạn cố gắng thực hiện một thao tác bằng loại dữ liệu không tương thích. Ví dụ: nếu bạn cố gắng thêm một chuỗi và một số nguyên hoặc kết hợp một chuỗi với một số nguyên, bạn sẽ gặp phải Lỗi Loại.

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

Nói chung, bất kỳ thao tác nào sử dụng kiểu dữ liệu không hợp lệ sẽ dẫn đến TypeError.

Sau đây là ví dụ về các thao tác có thể dẫn đến lỗi kiểu:

# 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 đoạn mã trên được hiển thị bên dưới:

Sau đây là một ví dụ TypeError từ mã:

  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

Để giải quyết lỗi, hãy sử dụng đúng kiểu dữ liệu hoặc chuyển đổi kiểu như dưới đây:

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, AttributionError 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 một đố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ó được gọi tới. AttributionError cho thấy đối tượng không có thuộc tính hoặc phương thức nào được gọi trên đó.

Ví dụ: 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 phải AttributionError vì phương thức đó 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 Capitalize(), được sử dụng để chuyển đổi chữ cái đầu tiên của chuỗi thành chữ hoa, đượ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 sẽ dẫn đến thông báo lỗi hiển thị bên dưới:

Thông báo AttributionError 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 AttributionError, hãy đảm bảo rằng phương thức hoặc thuộc tính được gọi tồn tại trên loại đối tượng mà nó đang được gọi. Trong trường hợp này, việc gọi Capitalize() trên kiểu dữ liệu chuỗi sẽ giải quyết lỗi này như dưới đây:

Lỗi nhập

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 có sẵn trong môi trường hiện tại. Có thể nó chưa được cài đặt, bạn chưa thiết lập đúng đường dẫn của nó hoặc bạn gõ nhầm mô-đun bạn đang cố cài đặt.

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

Ví dụ: đoạn mã sau khi cố gắng nhập thư viện phân tích dữ liệu gấu trúc sẽ đưa ra lỗi này do mô-đun chưa được cài đặt.

ImportError được tạo đượ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'

Để khắc phục 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. Nếu cách đó không giải quyết được vấn đề, 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.

Lỗi giá trị

Đây là một ngoại lệ xảy ra khi hàm Python nhận được giá trị của kiểu dữ liệu chính xác, nhưng giá trị đó lại sai. Ví dụ: hàm Math.sqrt() dùng để tìm căn bậc hai của các giá trị số sẽ trả về lỗi giá trị nếu bạn chỉ định số âm.

Miễn là giá trị thuộc loại đúng, tức là giá trị số, giá trị âm sẽ làm cho giá trị đó trở thành giá trị không hợp lệ đối với

Hàm int() chuyển đổi một số hoặc chuỗi sẽ trả về lỗi giá trị nếu bạn truyền một chuỗi không phải là giá trị chuỗi số. Truyền “123” hoặc “45” cho hàm không trả về lỗi vì 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 truyền một chuỗi không phải là chuỗi số, chẳng hạn như “Xin chào”, thì ValueError sẽ được trả về. Đ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ì không có số nguyên tương đương.

Một ví dụ về mã 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ư dưới đây:

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

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

IOBlỗi

IOError (Lỗi đầu vào/đầu ra) là một ngoại lệ xảy ra khi thao tác đầu vào hoặc đầu ra không thành công. Điều này có thể là do bạn đang cố truy cập một tệp không tồn tại, không đủ dung lượng ổ đĩa trên thiết bị của bạn, bạn đang cố truy cập một tệp mà bạn không có đủ quyền hoặc bạn đang cố truy cập một tệp hiện đang được sử dụng bởi các hoạt động 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 có thể gây ra lỗi này.

Hãy xem đoạn mã bên dưới cố gắng mở một tệp có tên “notes.txt” không tồn tại. Mã này gây ra 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 rằng tệp “notes.txt” tồn tại trong thư mục nơi bạn chạy terminal. Một cách khác để xử lý IOErrors là sử dụng khối thử ngoại trừ, như hiển thị 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 không được gán giá trị cho nó.

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

Đoạn mã sau sẽ đưa ra 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 đây là kết quả của đoạn mã trên:

Một thông báo NameError ví dụ đượ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 lỗi tên như vậy, hãy đảm bảo bạn không sử dụng mô-đun trước khi nhập chúng, không sử dụng biến hoặc hàm trước khi xác định chúng và không mắc lỗi chính tả 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()

Lỗi chỉ mục

IndexError là một ngoại lệ xảy ra khi bạn cố truy cập một chỉ mục trên danh sách hoặc bộ dữ liệu 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 mục. Python đếm chỉ mục từ 0 (số không). Vì vậy, danh sách trên có chỉ số từ 0 đến n-1trong đó n là một số hoặc các mục 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 xuống 4.

Nếu bạn cố gắng truy cập một phần tử có chỉ mục lớn hơn 4, bạn sẽ gặp phải IndexError vì chỉ mục nằm ngoài phạm vi trong danh sách mà bạn đang cố truy cập vào mục đó. Đoạn mã sau tạo ra 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ị dưới đây:

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 rằng bạn chỉ truy cập các phần tử nằm trong phạm vi đó:

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

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

Lỗi phím

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óa đó không thể tìm thấy 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 mục có khóa không tồn tại, chẳng hạn như “Brazil”, bạn sẽ gặp phải lỗi khóa như hình dưới đây:

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 rằng các khóa bạn sử dụng để truy cập các mục 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 tránh được KeyErrors khi truy cập các phần tử từ từ điển

Ứng dụng

Khi viết mã bằng Python, bất kể trình độ chuyên môn của bạn là gì, bạn chắc chắn sẽ gặp phải lỗi. Vì vậy, 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 rằng bạn có thể xử lý chúng khi chúng xảy ra.

Bạn cũng có thể xem một số hướng dẫn hữu ích về Python để đơn giản hóa các tác vụ thông thường.