Instances of BaseException and family don't provide __module__?
Scott Dial
geekmug at gmail.com
Fri Nov 2 22:36:05 EDT 2007
I have started working on a new project using ZSI and perhaps one can
argue this is a bug in ZSI, but I found it odd. The ZSI dispatcher
needs to catch all exceptions and pass that over to the client; in
doing so, it passes along the name of the exception that occurred so
that the client can know more than just "it failed." Anyways, I am
getting off the point, the mechanics of this code in ZSI goes more or
less like this:
>>> try:
>>> doSomething()
>>> except Exception, ex:
>>> sendFault(':'.join([ex.__module__, ex.__class__.__name__]))
This works just fine for user-defined exceptions like:
>>> class UserException(Exception):
>>> pass
>>> uex = UserException()
>>> print ':'.join([uex.__module__, uex.__class__.__name__]) # __main__.UserException
But falls on its face with built-in exceptions:
>>> ex = Exception()
>>> print ':'.join([ex.__module__, ex.__class__.__name__]) # AttributeError!
, because the built-in exception instances don't have the __module__
attribute (as of 2.5). The only way this works in 2.4 as well as 2.5
is to do:
>>> print ':'.join([ex.__class__.__module__, ex.__class__.__name__]) # exceptions:Exception
>>> print ':'.join([uex.__class__.__module__, uex.__class__.__name__]) # __main__:NewException
But this is a bit obscure and I don't understand why user-defined
exception instances should have a different set of attributes than the
built-in exception instances. As well as this is a change from 2.4-
>2.5 that breaks existing code for no apparent reason. This smells
like it was an overlooked mistake and not a feature. I am tempted to
open a bug against python for it, but I didn't know if someone could
give a rational reason why that attribute is missing?
Thanks,
-Scott
More information about the Python-list
mailing list