Exceptions and modules

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • sam

    Exceptions and modules

    Hello,

    consider the following code:

    <module1>
    import sys
    import threading

    class MyException(Exc eption):
    pass

    #from module1 import MyException

    class runner(threadin g.Thread):
    def __init__(self, callableObj):
    self.callableOb ject=callableOb j
    threading.Threa d.__init__(self )
    def run(self):
    try:
    self.callableOb ject.makeCall()
    except MyException, err:
    print "MyExceptio n"
    print sys.exc_type, err
    except Exception, err:
    print "Exception"
    print sys.exc_type, err

    if __name__ == '__main__':
    if len(sys.argv) != 3:
    print "Usage <module> <class>"
    else:
    callableObj = getattr(__impor t__(sys.argv[1]), sys.argv[2])()
    thread=runner(c allableObj)
    thread.start()
    </module1>
    <module2>
    from module1 import MyException

    class Callable:
    def makeCall(self):
    raise MyException("My Exception")
    </module2>

    Now I start the process:

    python module1.py module2 Callable

    And the result is:

    Exception
    module1.MyExcep tion MyException

    So the Exception isn't recognised even though it has the same
    namespace and name as the exception defined in the module. I have to
    uncomment the 7th line to get my example to behave as I would like it
    to.

    Is this a bug/feature? Is there any reason why it shouldn't work the
    way I expect it to?

    Regards,

    Sam Owen
  • Duncan Booth

    #2
    Re: Exceptions and modules

    westernsam@hotm ail.com (sam) wrote in
    news:292c8da4.0 307040627.59acd a19@posting.goo gle.com:
    [color=blue]
    > So the Exception isn't recognised even though it has the same
    > namespace and name as the exception defined in the module. I have to
    > uncomment the 7th line to get my example to behave as I would like it
    > to.
    >
    > Is this a bug/feature? Is there any reason why it shouldn't work the
    > way I expect it to?[/color]

    It's a feature, and it probably ought to be in the FAQ in some form.

    When you run 'python module1.py' the code in the source file module1.py is
    compiled into a module called __main__. That means that the line:

    except MyException, err:

    is actually short for:

    except __main__.MyExce ption, err:

    When module2 imports module1 the code is recompiled into a new module. Same
    source code, but otherwise no relation. You then raise module1.MyExcep tion
    which doesn't match __main__.MyExce ption.

    --
    Duncan Booth duncan@rcp.co.u k
    int month(char *p){return(1248 64/((p[0]+p[1]-p[2]&0x1f)+1)%12 )["\5\x8\3"
    "\6\7\xb\1\x9\x a\2\0\4"];} // Who said my code was obscure?

    Comment

    Working...