I'm trying to force the user to input a number using try-except in python however it seems to have no effect.
while count>0:
count=count - 1
while (length != 8):
GTIN=input("Please enter a product code ")
length= len(str(GTIN))
if length!= 8:
print("That is not an eight digit number")
count=count + 1
while valid == False:
try:
GTIN/5
valid = True
except ValueError:
print("That is an invalid number")
count=count + 1
Actually, if the user inputs for example a string, "hello"/5 yields a TypeError, not a ValueError, so catch that instead
You could try to make the input value an int int(value), which raises ValueError if it cannot be converted.
Here's a function that should do what you want with some comments:
def get_product_code():
value = ""
while True: # this will be escaped by the return
# get input from user and strip any extra whitespace: " input "
value = raw_input("Please enter a product code ").strip()
#if not value: # escape from input if nothing is entered
# return None
try:
int(value) # test if value is a number
except ValueError: # raised if cannot convert to an int
print("Input value is not a number")
value = ""
else: # an Exception was not raised
if len(value) == 8: # looks like a valid product code!
return value
else:
print("Input is not an eight digit number")
Once defined, call the function to get input from the user
product_code = get_product_code()
You should also be sure to except and handle KeyboardInterrupt anytime you're expecting user input, because they may put in ^C or something else to crash your program.
product code = None # prevent reference before assignment bugs
try:
product_code = get_product_code() # get code from the user
except KeyboardInterrupt: # catch user attempts to quit
print("^C\nInterrupted by user")
if product_code:
pass # do whatever you want with your product code
else:
print("no product code available!")
# perhaps exit here
Related
Hi i'm new to python and i am having issues with exceptions. i have added an exception but it is not working. Below is a sample of my problem.
if x == '1':
print("----------------------------------")
print("1. REQUEST FOR A DOG WALKER")
print("----------------------------------")
try:
print("Select a Date (DD/MM/YY) - eg 12/04/21")
except ValueError:
raise ValueError('empty string')
date = input()
try:
print("Select a Duration (in hours) - eg 2")
duration = input()
except ValueError:
print('empty string')
print("Select a breed : 1 - Rottwieler , 2 - Labrador Retriever, 3 - Pitbull, 4 - Other ")
breed = input()
print("Number of Dogs - eg 3 ")
dogsNumber = input()
Whenever you use a try/except statement you are trying to catch something happening in the code the shouldn't have happened. In your example, you are haveing the user enter a number for a duration:
print("Select a Duration (in hours) - eg 2")
duration = input()
At this point, duration might equal something like '2'. If you wanted to add 10 to it then you could not because it is a string(you cannot and int+str). In order to do something like this, you would have to convert the user input to an int. For example:
duration = int(input())
The problem is that if the user enters a letter A, then the program will break when it tries to convert it to an int. Using a try/except statement will catch this behavior and handle it properly. For example:
try:
print("Select a Duration (in hours) - eg 2")
duration = int(input())
except ValueError:
print('empty string')
There is nothing in your code that can produce ValueError.
So the except ValueError: is not matched.
1 - You are not checking any conditions to raise the error
2 - You're not catching the ValueError, you have to raise it and then catch in with the except statement.
Try this:
if x == '1':
print("----------------------------------")
print("1. REQUEST FOR A DOG WALKER")
print("----------------------------------")
print("Select a Date (DD/MM/YY) - eg 12/04/21")
try:
date = input()
if len(date) == 0:
raise ValueError('empty string')
except ValueError as error:
print(error)
I am trying to catch input errors from the user. The input should be a float. I cannot figure out the logic.
I want the user to redirected to the same key value in material_vars if they enter an invalid input. Currently I can make it work so if an incorrectly it goes back to the first key input rather than the key the invalid entry occurred on.
def material_costs(update=False):
global material_vars
while update:
try:
for key in material_vars:
material_vars[key] = float(input(f"Enter {key}:\n"))
except ValueError:
print ('Please enter a valid input')
else:
save_defaults('material_vars', material_vars)
update = False
else:
material_vars = open_defaults('material_vars')
return material_vars
You can modify your function like this
def material_costs(update=False):
global material_vars
while update:
for key in material_vars:
correct = False
while (not correct):
try:
material_vars[key] = float(input(f"Enter {key}:\n"))
correct = True
except ValueError:
print ('Please enter a valid input')
correct = False
save_defaults('material_vars', material_vars)
update = False
else:
material_vars = open_defaults('material_vars')
return material_vars
Run a while loop for each input until the user enters the correct input.
The input will be verified by the try-except blocks inside the while.
I hope this helps.
I have this code as shown below and I would like to make a function which has a try and except error which makes it so when you input anything other than 1, 2 or 3 it will make you re input it. Below is the line which asks you for your age.
Age = input("What is your age? 1, 2 or 3: ")
Below this is what I have so far to try and achieve what I want.
def Age_inputter(prompt=' '):
while True:
try:
return int(input(prompt))
except ValueError:
print("Not a valid input (an integer is expected)")
any ideas?
add a check before return then raise if check fails:
def Age_inputter(prompt=' '):
while True:
try:
age = int(input(prompt))
if age not in [1,2,3]: raise ValueError
return age
except ValueError:
print("Not a valid input (an integer is expected)")
This may work:
def Age_inputter(prompt=' '):
while True:
try:
input_age = int(input(prompt))
if input_age not in [1, 2, 3]:
# ask the user to input his age again...
print 'Not a valid input (1, 2 or 3 is expected)'
continue
return input_age
except (ValueError, NameError):
print 'Not a valid input (an integer is expected)'
My error-handling code is not working. I'm trying to do following: if user enters any input other than 1, 2 or 3, then the user should get error message and the while-loop should start again.
However my code is not working. Any suggestion why?
def main():
print("")
while True:
try:
number=int(input())
if number==1:
print("hei")
if number==2:
print("bye")
if number==3:
print("hei bye")
else:
raise ValueError
except ValueError:
print("Please press 1 for hei, 2 for bye and 3 for hei bye")
main()
You can also use exception handling a bit more nicely here to handle this case, eg:
def main():
# use a dict, so we can lookup the int->message to print
outputs = {1: 'hei', 2: 'bye', 3: 'hei bye'}
print() # print a blank line for some reason
while True:
try:
number = int(input()) # take input and attempt conversion to int
print(outputs[number]) # attempt to take that int and print the related message
except ValueError: # handle where we couldn't make an int
print('You did not enter an integer')
except KeyError: # we got an int, but couldn't find a message
print('You entered an integer, but not, 1, 2 or 3')
else: # no exceptions occurred, so all's okay, we can break the `while` now
break
main()
I query user input which is expected to be an int by using int(raw_input(...))
However when the user doesn't enter an integer, i.e. just hits return, I get a ValueError.
def inputValue(inputMatrix, rangeRows, rangeCols, defaultValue, playerValue):
rowPos = int(raw_input("Please enter the row, 0 indexed."))
colPos = int(raw_input("Please enter the column, 0 indexed."))
while True:
#Test if valid row col position and position does not have default value
if rangeRows.count(rowPos) == 1 and rangeCols.count(colPos) == 1 and inputMatrix[rowPos][colPos] == defaultValue:
inputMatrix[rowPos][colPos] = playerValue
break
else:
print "Either the RowCol Position doesn't exist or it is already filled in."
rowPos = int(raw_input("Please enter the row, 0 indexed."))
colPos = int(raw_input("Please enter the column, 0 indexed."))
return inputMatrix
I tried to be smart and use try and except to catch the ValueError, print a warning to the user and then call the inputValue() again. Then it works when the user enters return to the query but falls over when the user correctly then enters an integer
Below is the part of the amended code with the try and except:
def inputValue(inputMatrix, rangeRows, rangeCols, defaultValue, playerValue):
try:
rowPos = int(raw_input("Please enter the row, 0 indexed."))
except ValueError:
print "Please enter a valid input."
inputValue(inputMatrix, rangeRows, rangeCols, defaultValue, playerValue)
try:
colPos = int(raw_input("Please enter the column, 0 indexed."))
except ValueError:
print "Please enter a valid input."
inputValue(inputMatrix, rangeRows, rangeCols, defaultValue, playerValue)
A quick and dirty solution is:
parsed = False
while not parsed:
try:
x = int(raw_input('Enter the value:'))
parsed = True # we only get here if the previous line didn't throw an exception
except ValueError:
print 'Invalid value!'
This will keep prompting the user for input until parsed is True which will only happen if there was no exception.
Instead of calling inputValue recursively, you need to replace raw_input with your own function with validation and retry. Something like this:
def user_int(msg):
try:
return int(raw_input(msg))
except ValueError:
return user_int("Entered value is invalid, please try again")
Is something like this what you're going for?
def inputValue(inputMatrix, defaultValue, playerValue):
while True:
try:
rowPos = int(raw_input("Please enter the row, 0 indexed."))
colPos = int(raw_input("Please enter the column, 0 indexed."))
except ValueError:
continue
if inputMatrix[rowPos][colPos] == defaultValue:
inputMatrix[rowPos][colPos] = playerValue
break
return inputMatrix
print inputValue([[0,0,0], [0,0,0], [0,0,0]], 0, 1)
You were right to try and handle the exception, but you don't seem to understand how functions work... Calling inputValue from within inputValue is called recursion, and it's probably not what you want here.