Exceptions and modules

S

sam

Hello,

consider the following code:

<module1>
import sys
import threading

class MyException(Exception):
pass

#from module1 import MyException

class runner(threading.Thread):
def __init__(self, callableObj):
self.callableObject=callableObj
threading.Thread.__init__(self)
def run(self):
try:
self.callableObject.makeCall()
except MyException, err:
print "MyException"
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(__import__(sys.argv[1]), sys.argv[2])()
thread=runner(callableObj)
thread.start()
</module1>
<module2>
from module1 import MyException

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

Now I start the process:

python module1.py module2 Callable

And the result is:

Exception
module1.MyException 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
 
D

Duncan Booth

(e-mail address removed) (sam) wrote in
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?

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__.MyException, err:

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

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

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top