Difference between calling sys.exit() and throwing exception
sys.exit
raises a SystemExit
itself so from a purely technical point of view there's no difference between raising that exception yourself or using sys.exit
. And yes you can catch SystemExit
exceptions like any other exception and ignore it.
So it's just a matter of documenting your intent better.
PS: Note that this also means that sys.exit
is actually a pretty bad misnomer - because if you use sys.exit
in a thread only the thread is terminated and nothing else. That can be pretty annoying, yes.
There's a small, subtle difference:
import sys
try:
sys.exit()
except:
print("Caught")
that except
statement catches the exception whereas:
import sys
try:
sys.exit()
except Exception:
print("Caught")
exits without error. SystemExit
exception (like KeyboardInterrupt
) isn't caught by except Exception
, but caught by except
alone.
So if the caller catches everything with except:
(which is bad practice), your sys.exit
won't quit but will be considered as an "error". That's why except Exception:
is better to be sure to catch all exceptions except CTRL+C and system exit (which are of the BaseException
class).