Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Handle SystemExit exception

799 views
Skip to first unread message

asit

unread,
Feb 1, 2009, 4:27:26 AM2/1/09
to
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

Gabriel Genellina

unread,
Feb 1, 2009, 4:45:30 AM2/1/09
to pytho...@python.org
En Sun, 01 Feb 2009 07:27:26 -0200, asit <lip...@gmail.com> escribió:

> 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: ...

--
Gabriel Genellina

Steven D'Aprano

unread,
Feb 1, 2009, 4:46:20 AM2/1/09
to
asit wrote:

> 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:

>>> try:
... 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


--
Steven

asit

unread,
Feb 1, 2009, 5:29:54 AM2/1/09
to
Thanx everyone

This is my fault. Exception was thrown before the main function.

0 new messages