Pre-defining an action to take when an expected error occurs

John Machin sjmachin at lexicon.net
Fri Sep 15 05:55:54 CEST 2006


Tempo wrote:
> Hello. I am getting the error that is displayed below, and I know
> exactly why it occurs. I posted some of my program's code below, and if
> you look at it you will see that the error terminates the program
> pre-maturely. Becasue of this pre-mature termination, the program is
> not able to execute it's final line of code, which is a very important
> line. The last line saves the Excel spreadsheet. So is there a way to
> make sure the last line executes? Thanks in advanced for all of the
> help. Thank you.
>
>
> Error
> ####
>
> IndexError: list index out of range
>
[snip]

Hi, Tempo, nice to see xlrd getting some usage :-)

Are you sure that you *really* want to save a spreadsheet written by
your buggy program??? It is better to fix errors, rather than ignore
them.

However, as you asked how: To ensure that cleanup code is executed no
matter what happens, use try/except/finally as in the following
example.

HTH,
John


C:\junk>type tempo.py
import sys

def main(n):
    return (10 ** n) / n

try:
    try:
        print "executing the application ..."
        n = int(sys.argv[1])
        if n < 0:
            # simulate something nasty happening ...
            import nosuchmodule
        else:
            x = main(n)
        print "app completed normally: %r" % x
    except KeyboardInterrupt:
        # need this to escape when n is large
        print "kbd interrupt ...."
        raise
    except ZeroDivisionError:
        print "doh!"
        raise
finally:
    # code to be executed no matter what happens
    print "finally ... cleaning up"

C:\junk>tempo.py 0
executing the application ...
doh!
finally ... cleaning up
Traceback (most recent call last):
  File "C:\junk\tempo.py", line 14, in ?
    x = main(n)
  File "C:\junk\tempo.py", line 4, in main
    return (10 ** n) / n
ZeroDivisionError: integer division or modulo by zero

C:\junk>tempo.py -1
executing the application ...
finally ... cleaning up
Traceback (most recent call last):
  File "C:\junk\tempo.py", line 12, in ?
    import nosuchmodule
ImportError: No module named nosuchmodule

C:\junk>tempo.py 3
executing the application ...
app completed normally: 333
finally ... cleaning up

C:\junk>tempo.py 10000000000
executing the application ...
kbd interrupt ....
finally ... cleaning up
Traceback (most recent call last):
  File "C:\junk\tempo.py", line 14, in ?
    x = main(n)
  File "C:\junk\tempo.py", line 4, in main
    return (10 ** n) / n
KeyboardInterrupt

C:\junk>




More information about the Python-list mailing list