Hướng dẫn python user input error handling - xử lý lỗi đầu vào của người dùng python

Tôi không biết tại sao tôi chưa bao giờ nghĩ về điều này trước đây ... nhưng tôi tự hỏi liệu có cách sử dụng lỗi ngắn hơn/ngắn hơn/hiệu quả hơn để xử lý đầu vào của người dùng không. Ví dụ: nếu tôi yêu cầu người dùng nhập "Xin chào" hoặc "Tạm biệt" và họ gõ một cái gì đó khác, tôi cần nói với người dùng rằng đó là sai và hỏi lại.

Đối với tất cả các mã hóa tôi đã từng thực hiện, đây là cách tôi đã thực hiện nó (thường là câu hỏi tốt hơn):

choice = raw_input("hello, goodbye, hey, or laters? ") 

while choice not in ("hello","goodbye","hey","laters"):

   print "You typed something wrong!"

   choice = raw_input("hello,goodbye,hey,or laters? ")

Có cách làm điều này thông minh hơn không? Hay tôi chỉ nên gắn bó với cách tôi đã có nó? Đây là phương pháp tôi sử dụng cho tất cả các ngôn ngữ tôi đã viết.

Hướng dẫn python user input error handling - xử lý lỗi đầu vào của người dùng python

Hỏi ngày 16 tháng 10 năm 2013 lúc 15:54Oct 16, 2013 at 15:54

user2869231user2869231user2869231

1.4015 huy hiệu vàng22 Huy hiệu bạc51 Huy hiệu đồng5 gold badges22 silver badges51 bronze badges

Đối với một kịch bản đơn giản, cách bạn có nó là tốt.

Đối với một hệ thống phức tạp hơn, bạn có hiệu quả khi viết trình phân tích cú pháp của riêng bạn.

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])

Đã trả lời ngày 16 tháng 10 năm 2013 lúc 16:04Oct 16, 2013 at 16:04

6

Nếu bạn sửa đổi mã của mình để luôn nhập vòng lặp

>>> possible = ["hello","goodbye","hey"]
>>> def ask():
...     choice = raw_input("hello,goodbye,hey,or laters? ")
...     if not choice in possible:
...         return ask()
...     return choice
... 
>>> ask()
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? hello
'hello'
>>> 
3, bạn chỉ phải có
>>> possible = ["hello","goodbye","hey"]
>>> def ask():
...     choice = raw_input("hello,goodbye,hey,or laters? ")
...     if not choice in possible:
...         return ask()
...     return choice
... 
>>> ask()
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? hello
'hello'
>>> 
4 trên một dòng.

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"

Đã trả lời ngày 16 tháng 10 năm 2013 lúc 16:01Oct 16, 2013 at 16:01

SethmmortonsethmmortonSethMMorton

43K12 Huy hiệu vàng64 Huy hiệu bạc82 Huy hiệu Đồng12 gold badges64 silver badges82 bronze badges

1

Bạn có thể làm điều đó với đệ quy

>>> possible = ["hello","goodbye","hey"]
>>> def ask():
...     choice = raw_input("hello,goodbye,hey,or laters? ")
...     if not choice in possible:
...         return ask()
...     return choice
... 
>>> ask()
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? hello
'hello'
>>> 

Đã trả lời ngày 16 tháng 10 năm 2013 lúc 16:03Oct 16, 2013 at 16:03

Người dùng thanh Foo Bar userfooFoo Bar User

2.4013 Huy hiệu vàng19 Huy hiệu bạc26 Huy hiệu đồng3 gold badges19 silver badges26 bronze badges

4

Đó là cách bạn làm điều đó. Có các tùy chọn trong danh sách có thể đẹp hơn mặc dù tùy thuộc vào cách bạn đang sử dụng nó.

options = ["hello", "goodbye", "hey", "laters"]
while choice not in options:
    print "You typed something wrong!"

Đã trả lời ngày 16 tháng 10 năm 2013 lúc 16:00Oct 16, 2013 at 16:00

MattiasmattiasMattias

4513 Huy hiệu bạc13 Huy hiệu Đồng3 silver badges13 bronze badges

3

Hành động dọn dẹp (thử ... cuối cùng)Bernd Klein. Last modified: 29 Jun 2022.

Cho đến nay, tuyên bố thử luôn được ghép đôi ngoại trừ các điều khoản. Nhưng có một cách khác để sử dụng nó là tốt. Tuyên bố thử có thể được theo sau bởi một điều khoản cuối cùng. Cuối cùng, các mệnh đề được gọi là điều khoản làm sạch hoặc chấm dứt, bởi vì chúng phải được thực thi trong mọi trường hợp, tức là điều khoản "cuối cùng" luôn được thực hiện bất kể ngoại lệ có xảy ra trong một khối thử hay không. Một ví dụ đơn giản để chứng minh điều khoản cuối cùng:

while True: choice = raw_input("hello, goodbye, hey, or laters? ") if choice in ("hello","goodbye","hey","laters"): break else: print "You typed something wrong!" 7

Kết hợp thử, ngoại trừ và cuối cùng

"Cuối cùng" và "ngoại trừ" có thể được sử dụng cùng nhau cho cùng một khối thử, vì nó có thể thấy trong ví dụ Python sau:

Hướng dẫn python user input error handling - xử lý lỗi đầu vào của người dùng python

điều khoản khác

Xử lý ngoại lệ trong Python rất giống với Java. Mã, chứa rủi ro của một ngoại lệ, được nhúng trong một khối thử. Mặc dù trong các trường hợp ngoại lệ của Java bị bắt bởi các điều khoản bắt, trong Python, chúng tôi có các tuyên bố được giới thiệu bởi một từ khóa "ngoại trừ". Có thể tạo các trường hợp ngoại lệ "tùy chỉnh": Với câu lệnh READ, có thể buộc một ngoại lệ được chỉ định xảy ra.

Hãy xem xét một ví dụ đơn giản. Giả sử chúng tôi muốn yêu cầu người dùng nhập số nguyên. Nếu chúng ta sử dụng đầu vào (), đầu vào sẽ là một chuỗi mà chúng ta phải chuyển thành một số nguyên. Nếu đầu vào không phải là một số nguyên hợp lệ, chúng tôi sẽ tạo (tăng) một giá trị. Chúng tôi hiển thị điều này trong phiên tương tác sau:

n = int(input("Please enter a number: "))

Với sự trợ giúp của xử lý ngoại lệ, chúng ta có thể viết mã mạnh mẽ để đọc một số nguyên từ đầu vào:

while True:
    try:
        n = input("Please enter an integer: ")
        n = int(n)
        break
    except ValueError:
        print("No valid integer! Please try again ...")
print("Great, you successfully entered an integer!")

Đó là một vòng lặp, chỉ phá vỡ nếu một số nguyên hợp lệ đã được đưa ra. Vòng lặp trong khi được nhập. Mã trong mệnh đề thử sẽ được thực thi tuyên bố theo câu lệnh. Nếu không có ngoại lệ xảy ra trong quá trình thực hiện, việc thực thi sẽ đạt đến câu lệnh break và vòng lặp trong khi sẽ bị bỏ lại. Nếu một ngoại lệ xảy ra, tức là trong quá trình đúc N, phần còn lại của khối thử sẽ bị bỏ qua và mệnh đề ngoại trừ sẽ được thực thi. Lỗi nêu ra, trong trường hợp của chúng tôi, một giá trị, phải khớp với một trong các tên sau ngoại trừ. Trong ví dụ của chúng tôi, chỉ có một, tức là "ValueError:". Sau khi in văn bản của câu lệnh in, việc thực hiện thực hiện một vòng lặp khác. Nó bắt đầu với một đầu vào mới ().

Chúng ta có thể biến mã ở trên thành một hàm, có thể được sử dụng để có đầu vào không thể tin được.

def int_input(prompt):
    while True:
        try:
            age = int(input(prompt))
            return age
        except ValueError as e:
            print("Not a proper integer! Try it again")

Chúng tôi sử dụng điều này với ví dụ về tuổi chó của chúng tôi từ các tuyên bố có điều kiện của chương.

def dog2human_age(dog_age):
    human_age = -1
    if dog_age < 0:
        human_age = -1
    elif dog_age == 0:
        human_age = 0
    elif dog_age == 1:
        human_age = 14
    elif dog_age == 2:
        human_age = 22
    else:
        human_age = 22 + (dog_age -2) * 5
    return human_age

age = int_input("Age of your dog? ")
print("Age of the dog: ", dog2human_age(age))

OUTPUT:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
0

Nhiều điều khoản ngoại trừ

Một câu lệnh thử có thể có nhiều hơn một ngoại trừ mệnh đề cho các ngoại lệ khác nhau. Nhưng nhiều nhất là một điều khoản trừ mệnh đề sẽ được thực thi.

Ví dụ tiếp theo của chúng tôi cho thấy một mệnh đề thử, trong đó chúng tôi mở một tệp để đọc, đọc một dòng từ tệp này và chuyển đổi dòng này thành một số nguyên. Có ít nhất hai trường hợp ngoại lệ có thể:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
1

Chỉ trong trường hợp chúng tôi có thêm một điều không tên ngoại trừ mệnh đề cho một lỗi không mong muốn:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
2

OUTPUT:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
3

Việc xử lý ioerror trong ví dụ trước là mối quan tâm đặc biệt. Mệnh đề ngoại trừ cho ioerror chỉ định một biến "e" sau tên ngoại lệ (ioerror). Biến "E" được liên kết với một thể hiện ngoại lệ với các đối số được lưu trữ trong ví dụ.args. Nếu chúng tôi gọi tập lệnh trên với một tệp không tồn tại, chúng tôi sẽ nhận được thông báo:

Lỗi I/O (2): Không có tệp hoặc thư mục đó

Và nếu tệp Integers.txt không thể đọc được, ví dụ: Nếu chúng tôi không có quyền đọc nó, chúng tôi sẽ nhận được thông báo sau:

Lỗi I/O (13): bị từ chối cho phép

Một mệnh đề ngoại trừ có thể đặt tên nhiều hơn một ngoại lệ trong một bộ tên lỗi, như chúng ta thấy trong ví dụ sau:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
4

OUTPUT:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
5

Chúng tôi muốn chứng minh ngay bây giờ, điều gì xảy ra, nếu chúng tôi gọi một hàm trong một khối thử và nếu một ngoại lệ xảy ra bên trong cuộc gọi chức năng:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
6

OUTPUT:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
7

Các chức năng bắt được ngoại lệ.

Chúng tôi sẽ mở rộng ví dụ của chúng tôi ngay bây giờ để chức năng sẽ bắt gặp ngoại lệ trực tiếp:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
8

OUTPUT:

def get_choice(choices):
  choice = ""
  while choice not in choices:
      choice = raw_input("Choose one of [%s]:" % ", ".join(choices))
  return choice

choice = get_choice(["hello", "goodbye", "hey", "laters"])
9

Như chúng tôi đã mong đợi, ngoại lệ bị bắt trong chức năng chứ không phải trong ngoại lệ của người gọi:

Bây giờ chúng tôi thêm một "tăng", tạo lại giá trịerRor, để ngoại lệ sẽ được truyền đến người gọi:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
0

OUTPUT:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
1

Đào tạo Python sống

Hướng dẫn python user input error handling - xử lý lỗi đầu vào của người dùng python

Các khóa học trực tuyến sắp tới

Ghi danh ở đây

Các trường hợp ngoại lệ tùy chỉnh

Có thể tự tạo ra các ngoại lệ:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
2

OUTPUT:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
3

Cách tốt nhất hoặc pythonic để làm điều này, bao gồm việc xác định một lớp ngoại lệ kế thừa từ lớp ngoại lệ. Bạn sẽ phải trải qua chương về lập trình hướng đối tượng để hiểu đầy đủ ví dụ sau:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
4

OUTPUT:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
5

Hành động dọn dẹp (thử ... cuối cùng)

Cho đến nay, tuyên bố thử luôn được ghép đôi ngoại trừ các điều khoản. Nhưng có một cách khác để sử dụng nó là tốt. Tuyên bố thử có thể được theo sau bởi một điều khoản cuối cùng. Cuối cùng, các mệnh đề được gọi là điều khoản làm sạch hoặc chấm dứt, bởi vì chúng phải được thực thi trong mọi trường hợp, tức là điều khoản "cuối cùng" luôn được thực hiện bất kể ngoại lệ có xảy ra trong một khối thử hay không. Một ví dụ đơn giản để chứng minh điều khoản cuối cùng:finally clause. Finally clauses are called clean-up or termination clauses, because they must be executed under all circumstances, i.e. a "finally" clause is always executed regardless if an exception occurred in a try block or not. A simple example to demonstrate the finally clause:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
6

OUTPUT:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
7

Kết hợp thử, ngoại trừ và cuối cùng

"Cuối cùng" và "ngoại trừ" có thể được sử dụng cùng nhau cho cùng một khối thử, vì nó có thể thấy trong ví dụ Python sau:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
8

OUTPUT:

while True:
    choice = raw_input("hello, goodbye, hey, or laters? ")
    if choice in ("hello","goodbye","hey","laters"):
        break
    else:
        print "You typed something wrong!"
9

điều khoản khác

Việc thử ... ngoại trừ câu lệnh có một mệnh đề tùy chọn khác. Một khối khác phải được định vị sau tất cả các mệnh đề ngoại trừ. Một mệnh đề khác sẽ được thực thi nếu mệnh đề thử không tăng ngoại lệ.

Ví dụ sau đây mở một tệp và đọc trong tất cả các dòng vào một danh sách có tên là "Text":

>>> possible = ["hello","goodbye","hey"]
>>> def ask():
...     choice = raw_input("hello,goodbye,hey,or laters? ")
...     if not choice in possible:
...         return ask()
...     return choice
... 
>>> ask()
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? hello
'hello'
>>> 
0

OUTPUT:

Ví dụ này nhận tên tệp thông qua đối số dòng lệnh. Vì vậy, hãy chắc chắn rằng bạn gọi nó đúng cách: Hãy giả sử rằng bạn đã lưu chương trình này dưới dạng "Exception_test.py". Trong trường hợp này, bạn phải gọi nó với

>>> possible = ["hello","goodbye","hey"]
>>> def ask():
...     choice = raw_input("hello,goodbye,hey,or laters? ")
...     if not choice in possible:
...         return ask()
...     return choice
... 
>>> ask()
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? hello
'hello'
>>> 
1

Nếu bạn không muốn hành vi này, chỉ cần thay đổi dòng "file_name = sys.argv [1]" thành "file_name = 'integers.txt'".

Ví dụ trước gần giống như:

>>> possible = ["hello","goodbye","hey"]
>>> def ask():
...     choice = raw_input("hello,goodbye,hey,or laters? ")
...     if not choice in possible:
...         return ask()
...     return choice
... 
>>> ask()
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? d
hello,goodbye,hey,or laters? hello
'hello'
>>> 
2

OUTPUT:

Sự khác biệt chính là trong trường hợp đầu tiên, tất cả các câu lệnh của khối thử có thể dẫn đến cùng một thông báo lỗi "không thể mở ...", điều này là sai, nếu fh.close () hoặc fh.readlines () tăng lỗi .

Đào tạo Python sống

Hướng dẫn python user input error handling - xử lý lỗi đầu vào của người dùng python

Các khóa học trực tuyến sắp tới

Ghi danh ở đây

Làm thế nào để Python xử lý các lỗi đầu vào?

Hãy thử: với Open ("example.txt") dưới dạng my_file: đối với dòng trong myfile: in (dòng) ngoại trừ: in ("Có một lỗi khi đọc tệp.") Ở đây không phải do xử lý tệp như vậy, nhưng bởi tên biến bị sai chính tả.with open("example. txt") as my_file: for line in myfile: print(line) except: print("There was an error when reading the file.") An except block can hide the actual error: the problem here was not caused by file handling as such, but by the variable name which was misspelled.

Python có cho phép người dùng đầu vào không?

Python cho phép đầu vào của người dùng. Điều đó có nghĩa là chúng tôi có thể yêu cầu người dùng đầu vào.. That means we are able to ask the user for input.