How can I properly handle exceptions in my Python program?

  • Context: Python 
  • Thread starter Thread starter rawen
  • Start date Start date
  • Tags Tags
    Python
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
5 replies · 3K views
rawen
Messages
6
Reaction score
0
Code:
Hello, dear PFers. I'm currently beginning to learn Python and I got stuck at one exercise.

Homework Statement


Basically, I'm supposed to create a simple program that will calculate the position of an object according to the formula y(t) = v0*t - 0.5*g*t**2. Parameters v0 and t are supposed to be read from the command line and if one of them, or both are not given, the program should ask for them via an exception.


Homework Equations



The Attempt at a Solution


----------------------------------------------------------------
Code:
import getopt, sys
g = 9.81
options, args = getopt.getopt(sys.argv[1:], '',['v0=', 't='])
try:
    for option, value in options:
        if option == '--t':
            t = float(value)
        elif option == '--v0':
            v0 = float(value)
  
except:
    if '--t' not in options:
        t = raw_input('t= ?')
        t = float(t)
    elif '--v0' not in options:
        v0 = raw_input('v0= ?')
        v0 = float(v0)
       
y = v0*t - 0.5*g*t**2
print 'y=', y, 'm'
----------------------------------------------------------------

It apparently works if I provide a valid input on a command line, but if I omit one of the parameters, the program is terminated with NameError: name 'v0' is not defined (for example). It completely ignores my except block. I'm new to this so it may be a bit silly, but I'm thankful in advance for any help.
 
Last edited:
Physics news on Phys.org
When you say
if I omit one of the parameters,
do you mean when you invoke the code as, for example, prog --t --v 3
where you have forgotten to supply the value for the t parameter?
Or do you mean, for example, prog --v 3 where you have forgotten the --t 10 pair?

Are you building your program to accommodate both mistakes? As written, it doesn't.
 
Last edited:
NascentOxygen said:
When you say do you mean when you invoke the code as, for example, prog --t --v 3
where you have forgotten to supply the value for the t parameter?
Or do you mean, for example, prog --v 3 where you have forgotten the --t 10 pair?

Are you building your program to accommodate both mistakes? As written, it doesn't.

Yes, I'm aware of that. Writing prog --t --v 3 would result in a GetoptError, but I do not need to accommodate this mistake into the program. For now I'm concerned about prog --v 3 or prog --t 3 or only prog cases
 
Hi rawen. You are imagining an error condition where python will see none. Although python is powerful, it can't yet read minds. :smile:

Code:
     for option, value in options:
        if option == '--t':
            t = float(value)
        elif option == '--v0':
            v0 = float(value)

This statement will execute properly whether or not --t and --v0 are present. An if statement is not in error just because no match was found. So, python is content to execute this statement and has no reason to execute your except: block.

If you are determined to use the try: except: approach then you could experiment with deliberately creating an error condition, e.g.,

Code:
        if option == '--t':
            t = float(value)
        elif option == '--v0':
            v0 = float(value)
        else v0 = 0/0
I don't have python at hand to try this out, but it won't like dividing by zero. To give this a more polished appearance, I reckon if you look you'll probably find python has a built-in statement to raise an exception (I haven't used python for a while) and force a jump into your except: code.

In a short program it may be tidier to do away with the except: statement and incorporate its block of code into your if statement as a further else block, though it seems the specification for your assignment wants you to employ python's except: technique.
 
Last edited:
Hello, thanks for all the help guys. I've managed to get the program working.
This statement will execute properly whether or not --t and --v0 are present. An if statement is not in error just because no match was found. So, python is content to execute this statement and has no reason to execute your except: block.
I now see what I did wrong. Your post was especially helpful, Nascent.