How can I properly handle exceptions in my Python program?

  • Context: Python 
  • Thread starter Thread starter rawen
  • Start date Start date
  • Tags Tags
    Python
Click For Summary

Discussion Overview

The discussion revolves around handling exceptions in a Python program designed to calculate the position of an object using a specific formula. Participants explore how to manage command-line inputs and exceptions when parameters are missing, focusing on both theoretical understanding and practical implementation.

Discussion Character

  • Homework-related
  • Technical explanation
  • Exploratory

Main Points Raised

  • One participant describes a Python program that calculates position based on user-provided parameters and encounters a NameError when parameters are omitted.
  • Another participant suggests consulting Python documentation on exceptions and mentions the possibility of creating a custom exception.
  • Questions arise about the specific scenarios in which parameters might be omitted, with a focus on whether the program should handle multiple types of input errors.
  • A participant points out that the current code structure does not trigger the except block because the for loop executes without errors even if parameters are missing.
  • Suggestions are made to deliberately create an error condition to force the except block to execute, or to restructure the code to handle missing parameters without using exceptions.
  • One participant reports successfully resolving their issue after considering the feedback received, indicating a better understanding of how the code operates.

Areas of Agreement / Disagreement

Participants generally agree on the need to handle missing parameters but have differing views on the best approach to implement this, with no consensus on a single solution. The discussion remains unresolved regarding the optimal method for exception handling in this context.

Contextual Notes

There are limitations in the current code regarding how it handles missing command-line arguments, and the discussion highlights the need for clarity on error handling and user input validation.

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:
Technology news on Phys.org
The best I can do is point you to some documentation on python exceptions - http://docs.python.org/tutorial/errors.html.

I'm not at all familiar with python and how it handles exceptions, but I believe your code needs to raise an exception, probably a custom exception that you design. See sections 8.4 and 8.5 at the above link.

Hope that helps.
 
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.
 

Similar threads

  • · Replies 2 ·
Replies
2
Views
2K
Replies
55
Views
7K
  • · Replies 2 ·
Replies
2
Views
17K
Replies
11
Views
4K
  • · Replies 8 ·
Replies
8
Views
2K
  • · Replies 1 ·
Replies
1
Views
5K
  • · Replies 7 ·
Replies
7
Views
1K
  • · Replies 1 ·
Replies
1
Views
1K
Replies
2
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K