I'm trying to port an existing Java program I have. I have the following try section:
try:
quote = getValue(i)
writeData(i,quote)
except:
print("Oops!", sys.exc_info()[0], "occurred.")
Within the getValue(value) function, under some conditions I want to exit the program:
sys.exit()
However, the except clause intercepts also this kind of error:
Oops! <class 'SystemExit'> occurred.
From my Java background a System.exit() forces the termination of the program. What is the simplest way in Python to force exiting the program, even with an except clause?
CodePudding user response:
sys.exit just raises a SystemExit exception, which is a subclass of BaseException but not Exception.
>>> issubclass(SystemExit, Exception)
False
>>> issubclass(SystemExit, BaseException)
True
>>> issubclass(Exception, BaseException)
True
A base except catches all exceptions, equivalent to except BaseException, which is why you virtually never want to use a bare except. Use except Exception to only catch error-like exceptions, not flow-control exceptions as well.
try:
quote = getValue(i)
writeData(i,quote)
except Exception:
print("Oops!", sys.exc_info()[0], "occurred.")
As a general rule, you want to limit your except clauses as much as possible. When doing something as broad as except Exception, you usually want to exit your program or re-raise the exception, not treat it as handled just by logging it.
CodePudding user response:
You could catch the SystemException and use the value to call sys.exit() again:
import sys
try:
sys.exit(1)
except SystemExit as e:
sys.exit(e.code)
CodePudding user response:
The sys.exit() call does nothing more than raises a SystemExit exception. You are catching this.
You can handle that exception specifically and reraise it:
try:
quote = getValue(i)
writeData(i,quote)
except SystemExit:
raise
except:
print("Oops!", sys.exc_info()[0], "occurred.")
