Python Forum

Full Version: Avoiding traceback not through input filtering
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
This might be a strange question. I have the beginning and the end... but not sure how to connect the two.

I'm writing a program that asks for a positive integer.

How can I make use of this code snippet:
if type(n) != int:
    raise TypeError("n must be a positive integer")
if n < 1:
    raise ValueError("n must be a positive integer")
The preceding line is:
n = input("What term of the Fibonacci Sequence would you like to know? ")
The problem is input takes a string, which means I will always get the TypeError. I want the errors to occur only if a bona fide decimal is entered (e.g. 1.5) or a negative integer or letters. I don't want the input filtered (e.g. automatically changed to a string).

If I can't do this then I can write a workaround to test for integer and/or string... but I wanted to try this different approach.

Thanks!

Never mind. Not sure I know what I'm talking about with this!
You can do it with a very little change in the code
import ast

n = ast.literal_eval(input("What term of the Fibonacci Sequence would you like to know? "))

if type(n) != int:
    raise TypeError("n must be a positive integer")
if n < 1:
    raise ValueError("n must be a positive integer")
I just note that with Gribouillis code different ValueError will be raised during evaluation if string of character(s) is entered:

>>>  ast.literal_eval('a')
/.../
ValueError: malformed node or string: /.../
I doubt it is good coding but it matches the requirement:

n = input("What term of the Fibonacci Sequence would you like to know? ")

try: 
    n=int(n)
    if n<0:
        raise TypeError("n must be a positive integer")
except Exception as e: 
    raise TypeError("n must be a positive integer")
(Oct-16-2019, 10:00 AM)baquerik Wrote: [ -> ]I doubt it is good coding but it matches the requirement:

n = input("What term of the Fibonacci Sequence would you like to know? ")

try: 
    n=int(n)
    if n<0:
        raise TypeError("n must be a positive integer")
except Exception as e: 
    raise TypeError("n must be a positive integer")

That's basically how I would do it. This question, though... not really sure what I was getting at and I would have deleted the thread if I saw a "delete thread" button. Thanks anyway!
I think the try/except solution would work better this way:

n = input("What term of the Fibonacci Sequence would you like to know? ")
 
try: 
    n=int(n)
except ValueError: 
    raise TypeError("n must be a positive integer.")
if n<0:
    raise ValueError("n must be positive.")
This keeps the exception checking narrow (to avoid catching errors you didn't expect), and allows you to tailor your error to the specific problem with the input.