confusion around CustomException example in 'Python in a Nutshell'

erick_bodine at comcast.net erick_bodine at comcast.net
Sat Mar 12 13:46:54 EST 2005


Peter Hansen wrote:
> 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
>
This clears the fog a little.
>
> 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.

<classic keyboard fumbling>  What I am trying to do is get information
from a raised custom exception.  I am catching the exception in a
main() function but it was actually raised in a separate module
function.  It would be nice if I could print out where the exception
was raised from (module.function name + line number).

-------------------------
def some_module_function():
    if something_bad:
        raise LinuxDriverError, "raising.."
---------------------------

def main():
    try:
        mymodule.some_module_function()
    except LinuxDriverError, error:
        print error.message
        print error.from_where



Thanks,

--Erick


> 
> -Peter




More information about the Python-list mailing list