confusion around CustomException example in 'Python in a Nutshell'

Peter Hansen peter at engcorp.com
Fri Mar 11 20:17:38 EST 2005


erick_bodine at comcast.net wrote:
> In Martinelli's Nutshell book in the Exceptions chapter there is an
> example of a custom exception class (pg.112) that I am trying to
> implement without success.  The custom exception class example pulls
> sys.exc_info() into an attribute and I am assuming that the attribute
> would then contain the raised exception info in a tuple (admittedly I
> could be assuming erroneously).
> 
> class LinuxDriverError(Exception):
>     def __init__(self, *args):
>         Exception.__init__(self, *args)
>         self.message = args[0]
>         self.wrapped_exc = sys.exc_info()
> 
> try:
>     raise LinuxDriverError, "raising Cain!"
> except CustomException, error:
>     print error.message
>     print error.wrapped_exc
> 
>     # just checking
>     print "sys.exc_info(): ", sys.exc_info()
> 
> If I run the above code I get the following output:
> 
> Just raising Cain!
> wrapped_exc:  (None, None, None)
> sys.exc_info():  (<class __main__.LinuxDriverError at 0xf6f774dc>,
> <__main__.LinuxDriverError instance at 0xf6f74bec>, <traceback object
> at 0xf6f7193c>)
> 
> I do not understand why the wrapped_exc attribute contains no objects.

Because at the time you create the exception there is
no "current exception" as seen from the point of view
of sys.exc_info().

Given the way this class was written, it is clearly
intended to be raised from within an "except" statement
as a result of another exception having been caught.

Try this instead:

try:
     try:
         1/0
     except:
         raise LinuxDriverError, 'raising Cain!'
except Exception, ex:
     print ex.wrapped_exc


By the way, the code you show is probably not what you
were actually running anyway... you caught a
"CustomException" but the LinuxDriverError is not
a subclass of that class so it wouldn't/shouldn't
have been caught.

-Peter



More information about the Python-list mailing list