Instances of BaseException and family don't provide __module__?

S

Scott Dial

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
 
S

Steven D'Aprano

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."

I have no opinion on whether the problem you report is a bug in Python or
ZSI or not, but I'd suggest that passing along the name of the exception
is not the right way to go about it.

The right way is to pass along the exception itself:

try:
doSomething()
except Exception, ex:
sendFault(ex)
report_error_and_continue()

(Always assuming you want to continue.)

That gives the caller access to as much or as little of the exception as
it needs.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,042
Latest member
icassiem

Latest Threads

Top