Pop return from stack?
Thomas Jollans
thomas at jollybox.de
Sat Aug 14 19:23:11 EDT 2010
On Sunday 15 August 2010, it occurred to bvdp to exclaim:
> Assuming I have a module 'foo.py' with something like this:
>
> def error(s):
> print "Error", s
> sys.exit(1)
>
> def func(s):
> ... do some processing
> ... call error() if bad .. go to system exit.
> ... more processing
>
> and then I write a new program, test.py, which:
>
> import foo
>
> def myerror(s):
> print "new error message"
>
> foo.error = myerror
>
> a = foo.func(..)
>
> Now, if an error is encountered myerror() is called. Fine. But
> execution resumes in func(). Not exactly what I wanted.
>
> I can "fix" this simply by wrapping the call to foo.func() in a try/
> expect and have myerror() raise an exception. This appears to work,
> but I'm hesitant to use this out of fear that I'm building up some
> kind of stack overflow or something which will bite me later.
An exception will walk up the stack, calling any cleaning-up code that needs
to be done (removing object references, executing finally: blocks, exiting
context managers properly. It won't break anything. Don't be afraid of
Python's high-level features!
>
> Is there a better way? Simplest for an old assembler guy like me would
> be pop a return address off the stack ... but python isn't
> assembler :)
Now that has a decent chance of messing things up and you (if you wrote decent
assembly ;-)) know it -- without properly cleaning up before resuming
execution in the right place, you could end up in a right state with memory
leaks, leaked file descriptors, half-arsed database transactions, etc etc.
>
> I don't want to change stuff in the foo.py module since it's part of
> an existing program. But, if I must, I suppose I could. I'd prefer to
> just short-circuit this if possible.
Exceptions. Simple. In the end, all system.exit does is raise a SystemExit
exception...
- Thomas
More information about the Python-list
mailing list