Exceptions - How do you make it work like built-in exceptions?

Mark Tolonen mark.e.tolonen at mailinator.com
Sun Jan 13 13:51:59 EST 2008


"Lie" <Lie.1296 at gmail.com> wrote in message 
news:7888e20f-0775-46c4-a6e2-3fc3825c5145 at e23g2000prf.googlegroups.com...
>A built-in exceptions, when raised, would print traceback that points
> out the offending code, like this:
>
> Traceback (most recent call last):
>  File "F:\dir\code.py", line 43, in <module>
>    a = 1/0 <<<---
> ZeroDivisionError: integer division or modulo by zero
>
> a user-made exception, when raised, would print traceback that points
> out the code that raises the exception
>
> Traceback (most recent call last):
>  File "F:\dir\code.py", line 48, in <module>
>    raise SomeException('Some Exception Message') <<<---
> SomeException: Some Exception Message
>
> which is generally of little use (yeah, it's possible to trace the
> code from the line number, but sometimes it might not be that easy,
> cause the line number is (again) the line number for the raising code
> instead of the offending code)
>
> The sample exception was generated from this code:
> ####
> class SomeException(Exception):
>    pass
>
> try:
>    a = 1/0
> except:
>    raise SomeException('Some Exception Message')
> ####
>
> Is it possible to make the user-made exception points out the
> offending code?

The raise statement *was* the offending (unhandled exception) code.  The 
ZeroDivisionError was handled by your except clause.

You can override the traceback your exception will use with the 
three-expression form of the raise statement (See Section 6.9 "The raise 
statement" in the Python Reference Manual) by passing the traceback of the 
original exception:

###### CODE #####

import sys

class SomeException(Exception):
    pass

try:
    a=1/0
except:
    org_type,org_value,org_traceback = sys.exc_info()
    raise SomeException,'had some problems with this code',org_traceback

###### OUTPUT ######

Traceback (most recent call last):
  File "exc.py", line 7, in <module>
    a=1/0
SomeException: had some problems with this code


--Mark 




More information about the Python-list mailing list