Python xử lý lỗi đầu vào như thế nào?

Các lỗi trong loại 1 thường dễ sửa vì trình thông dịch Python đánh dấu vị trí lỗi khi cố gắng thực thi chương trình. Các lỗi cú pháp phổ biến bao gồm thiếu dấu hai chấm ở cuối dòng tiêu đề hoặc thiếu dấu ngoặc kép ở cuối chuỗi

Các lỗi trong loại 2 có thể khó phát hiện hơn, vì có thể xảy ra là chúng chỉ xảy ra tại một thời điểm nhất định trong quá trình thực thi chương trình và chỉ trong một số trường hợp nhất định. Chương trình có thể hoạt động tốt trong hầu hết các tình huống, nhưng tạm dừng do lỗi trong một trường hợp cận biên cụ thể. Bây giờ chúng ta sẽ tập trung xử lý các loại lỗi này

Xác thực đầu vào

Nhiều lỗi xuất hiện trong quá trình thực thi chương trình liên quan đến đầu vào không hợp lệ. Một số ví dụ bao gồm

  • giá trị đầu vào bị thiếu hoặc trống trong các trường bắt buộc, chẳng hạn như chuỗi trống khi độ dài của chuỗi là quan trọng
  • các giá trị âm khi chỉ các giá trị dương được chấp nhận, chẳng hạn như -15 là lượng của một thành phần trong công thức
  • thiếu tệp hoặc lỗi chính tả trong tên tệp
  • các giá trị quá nhỏ hoặc quá lớn, chẳng hạn như khi làm việc với ngày và giờ
  • chỉ mục không hợp lệ, chẳng hạn như cố gắng truy cập chỉ mục 3 trong chuỗi "hey"
  • giá trị của một loại sai, chẳng hạn như chuỗi khi số nguyên được mong đợi

May mắn thay, lập trình viên chúng tôi có thể chuẩn bị cho hầu hết các lỗi. Hãy xem một chương trình hỏi tuổi của người dùng và đảm bảo rằng đó là một số có thể chấp nhận được (trong trường hợp này là từ 0 đến 150)

age = int(input("Please type in your age: "))
if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")

đầu ra mẫu

Vui lòng nhập tuổi của bạn. 25 Đó là một độ tuổi tốt

đầu ra mẫu

Vui lòng nhập tuổi của bạn. -3 Đây không phải là độ tuổi hợp lệ

Miễn là người dùng nhập một giá trị số nguyên, quá trình xác thực đầu vào của chúng tôi dường như hoạt động tốt. Nhưng nếu họ gõ vào một chuỗi thì sao?

đầu ra mẫu

Vui lòng nhập tuổi của bạn. hai mươi ba ValueError. chữ không hợp lệ cho int() với cơ số 10. 'hai mươi ba'

Hàm

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
5 không thể phân tích cú pháp chuỗi đầu vào
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
0 dưới dạng giá trị số nguyên hợp lệ. Quá trình thực thi tạm dừng và thông báo lỗi trên được in

ngoại lệ

Lỗi xảy ra trong khi chương trình đang chạy được gọi là ngoại lệ. Có thể chuẩn bị cho các trường hợp ngoại lệ và xử lý chúng để quá trình thực thi vẫn tiếp tục mặc dù chúng xảy ra

Xử lý ngoại lệ trong Python được thực hiện bằng các câu lệnh

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
1 và
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2. Ý tưởng là nếu thứ gì đó trong khối
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
1 gây ra ngoại lệ, Python sẽ kiểm tra xem có khối
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2 tương ứng không. Nếu một khối như vậy tồn tại, nó sẽ được thực thi và chương trình sẽ tiếp tục như không có gì xảy ra

Hãy thay đổi ví dụ trên để chương trình chuẩn bị cho ngoại lệ

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
5

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")

đầu ra mẫu

Vui lòng nhập tuổi của bạn. hai mươi ba Đây không phải là tuổi hợp lệ

Chúng tôi có thể sử dụng khối

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
1 để gắn cờ rằng mã trong khối có thể gây ra lỗi. Trong câu lệnh
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2 ngay sau khối, lỗi liên quan được đề cập. Trong ví dụ trên, chúng tôi chỉ đề cập đến một ngoại lệ
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
5. Nếu ngoại lệ có một số nguyên nhân khác, thì quá trình thực thi vẫn bị tạm dừng, bất chấp các khối
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
1 và
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2

Trong ví dụ trên, nếu bắt gặp lỗi, giá trị của

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
31 được đặt thành -1. Đây là một giá trị đầu vào không hợp lệ mà chúng tôi đã lập trình hành vi vì chương trình mong đợi tuổi của người dùng lớn hơn 0

Trong ví dụ sau, chúng ta có một hàm

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
32, hàm này yêu cầu người dùng nhập một giá trị số nguyên, nhưng hàm này cũng được chuẩn bị cho trường hợp đầu vào không hợp lệ. Hàm tiếp tục yêu cầu số nguyên cho đến khi người dùng nhập giá trị đầu vào hợp lệ

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
3

đầu ra mẫu

Vui lòng nhập số nguyên. ba Dữ liệu nhập này không hợp lệ Vui lòng nhập một số nguyên. aybabtu Thông tin nhập này không hợp lệ Vui lòng nhập một số nguyên. 5 Cảm ơn bạn. 5 luỹ thừa của ba là 125

Đôi khi, chỉ cần bắt ngoại lệ với cấu trúc ngoại trừ thử mà không cần làm gì với chúng là đủ. Đó là, chúng ta có thể bỏ qua tình huống trong khối

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2

Nếu chúng ta thay đổi ví dụ trên để chúng ta chỉ chấp nhận các số nguyên nhỏ hơn 100, kết quả sẽ như thế này

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
7

đầu ra mẫu

Vui lòng nhập số nguyên. ba Dữ liệu nhập này không hợp lệ Vui lòng nhập một số nguyên. 1000 Dữ liệu nhập này không hợp lệ Vui lòng nhập số nguyên. 5 Cảm ơn bạn. 5 luỹ thừa của ba là 125

Bây giờ khối

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2 chỉ chứa lệnh
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
35, lệnh này không làm gì cả. Python không cho phép các khối trống, vì vậy lệnh là cần thiết

Đang tải

lỗi điển hình

Dưới đây là tuyển tập các lỗi điển hình mà bạn có thể sẽ gặp phải, cùng với một số tình huống mà chúng có thể xảy ra

Giá trịError

Lỗi này thường xuất hiện khi đối số được truyền cho một hàm không hợp lệ. Ví dụ: lệnh gọi hàm

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
36 gây ra lỗi, vì số thập phân luôn được phân tách bằng dấu chấm trong Python và ở đây chúng tôi có dấu phẩy

LoạiLỗi

Lỗi này xảy ra khi một giá trị không đúng loại. Ví dụ: lệnh gọi hàm

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
37 gây ra lỗi
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
38, vì hàm
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
39 yêu cầu giá trị có thể tính được độ dài, chẳng hạn như chuỗi hoặc danh sách

Chỉ mụcLỗi

Lỗi phổ biến này xảy ra khi cố gắng tham khảo một chỉ mục không tồn tại. Ví dụ, biểu thức

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
70 gây ra một
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
71, bởi vì chuỗi trong câu hỏi không có chỉ số 5

ZeroDivisionLỗi

Đúng như tên gọi, lỗi này xảy ra khi cố gắng chia cho 0, điều mà chúng ta biết từ toán học luôn là một ý tưởng tồi. Ví dụ: nếu chúng ta cố gắng xác định giá trị trung bình cộng của một danh sách có công thức

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
72, nhưng danh sách của chúng ta có độ dài bằng 0, lỗi này sẽ xảy ra

Ngoại lệ trong xử lý tệp

Một số lỗi phổ biến khi làm việc với tệp là FileNotFoundError (khi cố gắng truy cập tệp không tồn tại), io. UnsupportedOperation (khi cố gắng thực hiện thao tác trên một tệp không được chế độ mở tệp hỗ trợ) hoặc PermissionError (chương trình thiếu các quyền cần thiết để truy cập tệp)

Xử lý nhiều ngoại lệ cùng một lúc

Có thể có nhiều hơn một khối

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2 được đính kèm với mỗi khối
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
1. Ví dụ: chương trình sau có thể xử lý cả
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
75 và
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
76

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
1

Đôi khi không cần chỉ định lỗi mà chương trình chuẩn bị cho. Đặc biệt là khi xử lý các tệp, thường đủ để biết rằng đã xảy ra lỗi và thoát khỏi chương trình một cách an toàn. Không phải lúc nào cũng cần biết tại sao xảy ra lỗi. Nếu chúng ta cần bao gồm tất cả các trường hợp ngoại lệ có thể xảy ra, chúng ta có thể sử dụng khối

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2 mà không chỉ định lỗi

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
3

NB. câu lệnh

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2 ở đây bao gồm tất cả các lỗi có thể xảy ra, ngay cả những lỗi do lỗi lập trình gây ra. Chỉ có các lỗi cú pháp sẽ không bị phát hiện bởi điều này, vì chúng ngăn không cho mã được thực thi ngay từ đầu

Ví dụ, chương trình sau sẽ luôn báo lỗi vì tên biến

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
79 được viết là
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
10 ở dòng thứ ba

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
7

Một khối

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2 có thể ẩn lỗi thực tế. vấn đề ở đây không phải do xử lý tệp như vậy mà do tên biến bị viết sai chính tả. Nếu không có khối
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2, lỗi được đưa ra sẽ được hiển thị và nguyên nhân có thể được tìm thấy dễ dàng hơn. Do đó, tốt nhất là chỉ sử dụng các khối
try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2 được khai báo cụ thể cho một số loại lỗi nhất định

vượt qua ngoại lệ

Nếu việc thực thi một chức năng gây ra một ngoại lệ và ngoại lệ này không được xử lý, thì nó sẽ được chuyển sang phần mã được gọi là hàm đó, v.v. tiếp tục chuỗi lệnh gọi, cho đến khi nó đạt đến cấp độ chức năng chính. Nếu nó không được xử lý ở đó, thì việc thực thi chương trình sẽ tạm dừng và ngoại lệ thường được in ra để người dùng xem.

Trong ví dụ sau, chúng ta có hàm

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
14. Nếu nó gây ra một ngoại lệ, điều này không được xử lý trong chính chức năng đó mà trong chức năng chính

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
2

đầu ra mẫu

Vui lòng nhập một số. ba Đã xảy ra sự cố

Tăng ngoại lệ

Bạn cũng có thể đưa ra các ngoại lệ bằng lệnh

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
15. Việc cố tình gây ra lỗi trong chương trình của bạn có vẻ là một ý tưởng kỳ quặc, nhưng trên thực tế, đây có thể là một cơ chế rất hữu ích.

Chẳng hạn, đôi khi có thể đưa ra lỗi khi phát hiện các tham số không hợp lệ. Cho đến nay, chúng ta thường in ra các thông báo khi xác thực đầu vào, nhưng nếu chúng ta đang viết một hàm được thực thi từ nơi khác, thì việc in ra một cái gì đó có thể không được chú ý khi hàm được gọi. Đưa ra lỗi có thể giúp việc gỡ lỗi dễ dàng hơn

Trong ví dụ sau chúng ta có một hàm tính giai thừa (ví dụ giai thừa của số 5 là 1 * 2 * 3 * 4 * 5). Nếu đối số được truyền cho hàm là âm, thì hàm sẽ báo lỗi

try:
    age = int(input("Please type in your age: "))
except ValueError:
    age = -1

if age >= 0 and age <= 150:
    print("That is a fine age")
else:
    print("This is not a valid age")
4

đầu ra mẫu

6 720 Traceback (lần gọi gần đây nhất). Tập tin "kiểm tra. py", dòng 11, inprint(factorial(-1)) Tệp "kiểm tra. py", dòng 3, trong giai thừa tăng ValueError("Đầu vào âm. " + str(n)) Giá trịLỗi. Đầu vào là tiêu cực. -1

Python xử lý các đầu vào không hợp lệ như thế nào?

Yêu cầu người dùng nhập lại giá trị nếu người dùng nhập giá trị không hợp lệ. .
Nhận đầu vào từ người dùng bằng raw_input() (Python 2) hoặc input() (Python 3)
Kiểu tên biến là string nên ta phải dùng phương thức string để user nhập string hợp lệ
Sử dụng phương thức chuỗi isalpha() để kiểm tra chuỗi người dùng nhập vào có hợp lệ hay không

Lỗi được xử lý như thế nào trong lập trình Python?

Không thể xử lý lỗi, trong khi các ngoại lệ Python có thể được xử lý trong thời gian chạy. Lỗi có thể là lỗi cú pháp (phân tích cú pháp), trong khi có thể có nhiều loại ngoại lệ có thể xảy ra trong quá trình thực thi và không phải là không thể hoạt động vô điều kiện. .
Lỗi cú pháp
Lỗi bộ nhớ
Lỗi đệ quy
ngoại lệ