halt processing of program AND stop traceback?
Question: I have a program that needs to stop processing altogether once a certain
condition has been triggered - similar to this question: [How do I abort the
execution of a Python script?](http://stackoverflow.com/questions/179369/how-
do-i-abort-the-execution-of-a-python-script)

However, in my case, I want to capture the traceback that sys.exit() generates
AND MOST IMPORTANTLY stop processing anything code blocks beyond that point.
Can anyone help with this?

    
    
    try:
        a = 'i' / 1
        print 'Does this work yet?'
    except TypeError:
        print "I should stop processing now"
        try:
            sys.exit()
        except:
            pass
    print 'I did not stop processing '
    


Answer: I'm not entirely sure what you are asking, as far as I know `sys.exit()` does
not generate a traceback. If you try to execute your code as it is,
`sys.exit()` raises an unhandled NameError exception because you have not
imported the "sys" module. Surrounding the call to sys.exit() with a
try/except block will capture the NameError exception, but it will also
capture the normal exception raised by sys.exit(), as per the documentation:

> Exit from Python. This is implemented by raising the SystemExit exception,
> so cleanup actions specified by finally clauses of try statements are
> honored, and it is possible to intercept the exit attempt at an outer level.

Here is a version that stops processing once it encounters an error.

    
    
    import sys
    
    try:
        a = 'i' / 1
        print 'Does this work yet?'
    except TypeError:
        print "I should stop processing now"
        sys.exit()
    print 'I did not stop processing '
    

If this code is in your main module, I suggest wrapping your entry-point code
up like this:

    
    
    import sys
    
    def main():
        try:
            a = 'i' / 1
            print 'Does this work yet?'
        except TypeError:
            print "I should stop processing now"
            return 1
        print 'I did not stop processing '
        return 0
    
    if __name__ == "__main__": sys.exit(main())
    

This way you only ever have one call to sys.exit(), and it returns an error
code indicating if there was a problem. If your code is not in the top-level
entry point, I suggest you just throw the exception up until it gets to the
main() method, where it can then return the error code value. You can wrap the
real exception in a new "StopMyApplicationException" that you have to define.

Oh, and if you want to print the traceback, you can use the `traceback`
module, something like `traceback.print_exc()` will do the job.

