пока / try / кроме десятичной ошибки TypeError не работает - PullRequest
0 голосов
/ 01 июля 2018

Я думал, что смогу наконец-то извлечь пользу из цикла while / try / Кроме того, но столкнулся с проблемой. Моя задача состоит в том, чтобы получить компьютерные номера запросов от пользователя, пока не будет введено «0» После этого введенные номера будут добавлены. Моя проблема в том, что часть «Исключение» не перехватывает нечисловые записи. Если вводится нечисловая запись, я получаю обычное сообщение об ошибке, которое останавливает программу. Вот что происходит, когда я ввожу 3 числа, а четвертая запись - «м»:

 on win32
Type "copyright", "credits" or "license()" for more information.
>>> 
 RESTART: C:/Users/Username/Documents/CISPROG1/Homework 5/Homework5.1.SumGenerator.py 
Enter 1st element (or type '0' to finish). 
1
Enter 2nd element (or type '0' to finish). 
2
Enter 3rd element (or type '0' to finish). 
3
Enter 4th element (or type '0' to finish). 
m
Traceback (most recent call last):
  File "C:/Users/Username/Documents/CISPROG1/Homework 5/Homework5.1.SumGenerator.py", line 24, in <module>
    + "%s element (or type '0' to finish). \n" % suffix()))
decimal.InvalidOperation: [<class 'decimal.ConversionSyntax'>]
>>>

Я думал, что это будет "TypeError", но это не ловит его. Фактически, даже тип ошибки «Исключение» не ловит его. Как мне поймать нечисловой ввод? Я думаю, что проблема как-то связана с тем, как Python обрабатывает нецифровый ввод для типа Decimal.

Вот моя программа:

from decimal import *

#start:
lInputSequence = []
i = 1

def suffix():
    if i%10 == 1 and i != 11:
        return "st"
    elif i%10 == 2 and i != 12:
        return "nd"
    elif i%10 == 3 and i != 13:
        return "rd"
    else:
        return "th"

decInputElement = 1
while True:
    decInputElement = Decimal(input("Enter " + str(i)
                                    + "%s element (or type '0' to finish). \n" % suffix()))
    try:        
        if decInputElement == 0:
            break
        else:
            lInputSequence.append(decInputElement)
            i = i+1
    except TypeError:
        print("Please enter a number.")
print(lInputSequence)
print("The sum of these %s elements is %s" % (len(lInputSequence),sum(lInputSequence)))
#end

1 Ответ

0 голосов
/ 01 июля 2018

Итак, похоже, что проблема двоякая:

  1. Чтобы перехватить ошибку, вызванную неправильным вводом в десятичном виде, ввод должен быть в блоке try.
  2. Технически ошибка не является ошибкой типа, поэтому она не будет обнаружена без изменения типа ошибки в блоке «кроме».

Решение:

  1. Переместите строку ввода в блок try (согласно @Daniel Roseman) и
  2. Измените тип ошибки на «Исключение», который является всеобъемлющей категорией ошибок, которая улавливает любую конкретную ошибку.

Это не доходит до корня того, какая ошибка возникает, но она улавливает любые ошибки ввода.

from decimal import *

#start:
lInputSequence = []
i = 1

def suffix():
    if i%10 == 1 and i != 11:
        return "st"
    elif i%10 == 2 and i != 12:
        return "nd"
    elif i%10 == 3 and i != 13:
        return "rd"
    else:
        return "th"

decInputElement = 1
while True:
    try:
        decInputElement = Decimal(input("Enter " + str(i)
                                        + "%s element (or type '0' to finish). \n" % suffix()))
        if decInputElement == 0:
            break
        else:
            lInputSequence.append(decInputElement)
            i = i+1
    except Exception:
        print("Please enter a number.")
print(lInputSequence)
print("The sum of these %s elements is %s" % (len(lInputSequence),sum(lInputSequence)))
#end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...