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