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ỏ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:

đ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 >> 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

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.

Bài Viết Liên Quan

Chủ Đề