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