Handle SystemExit exception

A

asit

My program contains some sys.exit(1) and when its executed an
exception known as SystemExit is thrown.

I tried to handle bu using following code snippet

if __name__ == "__main__":
try:
main() #main contains sys.exit(1)
except KeyboardInterrupt:
print "aborted by user"
except SystemExit:
pass

But it does not work.

Can anyone help me out ???

Though KeyboradInterrupt is handled, but why SystemExit is not
handles ????

Regards
Asit Dhal
 
G

Gabriel Genellina

My program contains some sys.exit(1) and when its executed an
exception known as SystemExit is thrown.

This is normal behaviour - but you should not "see" the SystemExit. Do you
mean that a stack trace appears in the console?
I tried to handle bu using following code snippet

if __name__ == "__main__":
try:
main() #main contains sys.exit(1)
except KeyboardInterrupt:
print "aborted by user"
except SystemExit:
pass

But it does not work.

I've tested adding this:

def main():
sys.exit(1)

and it exited normally, even after removing the SystemExit clause.
Can anyone help me out ???

Though KeyboradInterrupt is handled, but why SystemExit is not
handles ????

Perhaps there is another try/except somewhere else that handles SystemExit?
Look for bare except clauses, like

try:
except: ...

They should *not* be used. With Python 2.5 and above, theh "catch-all"
should be written as:

try:
except Exception: ...

If you are using 2.4 or earlier, should be:

try:
except (SystemExit, KeyboardInterrupt): raise
except: ...
 
S

Steven D'Aprano

asit said:
My program contains some sys.exit(1) and when its executed an
exception known as SystemExit is thrown.

I tried to handle bu using following code snippet

if __name__ == "__main__":
try:
main() #main contains sys.exit(1)
except KeyboardInterrupt:
print "aborted by user"
except SystemExit:
pass

But it does not work.

It works for me:
.... sys.exit()
.... except SystemExit:
.... pass
....

What does it do for you? Crash? Exit? print garbage to the screen?


I'm going to guess what you are doing. Do you have code like this?

try:
main() #main contains sys.exit(1)
except KeyboardInterrupt:
print "aborted by user"
except SomeOtherException, SystemExit:
pass

This will mask SystemExit and stop it from being caught. It should be
written like this:

except (SomeOtherException, SystemExit):
pass



Or possibly something like this?

try:
main() #main contains sys.exit(1)
except KeyboardInterrupt:
print "aborted by user"
except Exception:
do_something()
raise
except SystemExit:
pass

The Exception clause will catch SystemExit before the SystemExit clause will
see it. That should be written like this:


except SystemExit:
pass
except Exception:
do_something()
raise
 

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,774
Messages
2,569,596
Members
45,143
Latest member
DewittMill
Top