Instances of BaseException and family don't provide __module__?

Discussion in 'Python' started by Scott Dial, Nov 3, 2007.

  1. Scott Dial

    Scott Dial Guest

    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
    Scott Dial, Nov 3, 2007
    #1
    1. Advertising

  2. On Fri, 02 Nov 2007 19:36:05 -0700, Scott Dial wrote:

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


    --
    Steven.
    Steven D'Aprano, Nov 3, 2007
    #2
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chad Austin
    Replies:
    0
    Views:
    273
    Chad Austin
    Aug 20, 2007
  2. Akira Kitada
    Replies:
    0
    Views:
    207
    Akira Kitada
    Apr 9, 2009
  3. Akira Kitada
    Replies:
    3
    Views:
    273
    Akira Kitada
    Apr 11, 2009
  4. Thomas Jollans
    Replies:
    0
    Views:
    678
    Thomas Jollans
    Sep 24, 2010
  5. Marco Buttu
    Replies:
    9
    Views:
    89
    Terry Reedy
    Aug 27, 2013
Loading...

Share This Page