Ошибка значения не попала в исключение

#python #python-3.x

Вопрос:

Я выполняю приведенный ниже код, чтобы перехватить ввод, который не является числом или числом, не входящим в диапазон. я мог уловить ошибку утверждения, но не ошибку значения. может ли кто-нибудь помочь мне понять, почему я не улавливаю ошибку ценности?

Что я пытаюсь сделать: я получаю ввод от пользователя, чтобы узнать, является ли x числом, и оно попадает в указанный диапазон, который равен min и max. если ввод не проходит проверку, я должен попросить пользователя снова ввести значение до тех пор , пока проверка не будет пройдена так: когда x = <<string>> я должен получить "Enter a valid int" сообщение. Когда x я не в пределах досягаемости, я должен попасть "Enter a number between -10 and 10" .

 def readint(x,min,max):
    try:
        #x=int(input("Enter number betwen min and max: "))
        assert (x<=max and x>=-min)
    except ValueError:
         print("Enter a valid int")
    except AssertionError:
        print("Enter a number between -10 and 10")
        
    except NameError:
        print("Enter a valid int")


while True:
    readint(x=int(input("Enter number betwen min and max: ")),min=-10,max=10)
 

Комментарии:

1. Место, куда вы звоните int(input(...)) , находится не внутри try (оно полностью находится за пределами функции), поэтому оно не будет поймано ValueError .

2. но я передаю параметр функции правильно? как я мог тогда поймать ошибку утверждения?

3. К делу это не относится, но вы никогда не должны получать a NameError , если только вы не стремитесь к совместимости с Python 2, и в этом случае вам также нужно будет поймать еще кучу ошибок. Вы стремитесь к совместимости с Python 2?

4. Выражение int(input(...)) вычисляется до того, как оно передается в функцию и функция выполняется.

5. Если вы хотите обнаружить исключение, возникающее в коде, который выполняется до вызова функции , то вам необходимо выполнить это обнаружение вне функции, в том месте, где вы выполняете вызов . Если вы хотите, чтобы функция выполняла всю обработку исключений, то она также должна выполнять всю работу, которая может вызвать исключение. Это очень просто. Мы здесь не путешественники во времени.

Ответ №1:

Вы получите ValueError , когда str произойдет сбой преобразования из int в. Я изменил вашу программу, поэтому ошибка выводится в блоке try / except :

 def readint(low, high):
    try:
        x = int(input(f"Enter number betwen {low} and {high}, inclusive: "))
        assert (low <= x and x <= high)
    except ValueError:
         print("Enter a valid int")
    except AssertionError:
        print(f"Enter a number between {low} and {high}, inclusive")
    except NameError:
        print("Enter a valid int")

while True:
    readint(-10, 10)
 

Следующее из приведенного выше кода:

 Enter number betwen min and max: 1
Enter number betwen min and max: 22
Enter a number between -10 and 10
Enter number betwen min and max: -1
Enter number betwen min and max: -22
Enter a number between -10 and 10
Enter number betwen min and max: asdf
Enter a valid int
 

Когда я ввел asdf , это взорвало преобразование в целое число, и ValueError было брошено a, поэтому мы видим «Введите допустимое значение int».

Комментарии:

1. Похоже, не удается отключить синтаксическую раскраску для вывода. Попробовал текст, открытый текст и никаких языковых подсказок.

2. none это самый простой способ отключить подсветку синтаксиса. Я исправил это для тебя 🙂

3. К вашему сведению, вы можете упростить проверку диапазона: min <= x <= max . Кроме того, рекомендуется избегать встроенных имен, таких как min и max , поскольку они затеняют встроенные имена; лично я бы использовал low и high вместо этого. Вам не нужно менять код, я просто упоминаю 🙂

4. Я переименовал min и max, спасибо, а также исправил запрос, в котором больше не отображались значения min и max. Однако ваше предложение по проверке диапазона не сработало 🙁

5. Неужели это не сработало? Попробуй assert low <= x <= high

Ответ №2:

Ответ таков:

 def readint( min, max):
    while True:
        try:
            x = int(input("Please enter a number: "))
            assert (x<=max and x>=min)
            return x
            break
        except ValueError:
            print("Enter a valid int")
        except AssertionError:
            print("Enter a number between -10 and 10")
    
        except NameError: 
            print("Enter a valid int")
#

v = readint( -10, 10)
print("The number is:", v)
 

Комментарии:

1. Этот код предполагает другую спецификацию, чем ОП. Вместо «продолжайте читать что-то вечно и каждый раз предпринимайте действия», этот код выполняет «прочитайте одно значение и продолжайте пытаться, пока не получите его». Это меняет смысл.