Python Forum

Full Version: How to programmatically exit without Traceback?
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
This code ends by printing 4:
import sys

for i in range(10):
    if i == 5:
          sys.exit(0)
    print(i)
When I enter sum_two(3.5,6), the following prints "SystemExit" and then "UserWarning: To exit: use 'exit', 'quit', or Ctrl-D.
warn("To exit: use 'exit', 'quit', or Ctrl-D.", stacklevel=1)":
print()
print('The function sum_two(a,b) will sum integers a and b.')
print('If sum is between 15 to 20 then output will be 20.')

def sum_two(a,b):
    if type(a) != int or type(b) != int:
        print('a and b must both be integers.')
        sys.exit()
    if a+b > 15 and a+b < 20:
        sum = 20
    else: sum = a+b
    return sum
Why doesn't the latter give me a clean exit like the former? Thanks!
use try/except clauses around code in question. see: https://docs.python.org/3/tutorial/error...exceptions
How are you running your program? Are you using ipython or something besides just "python"?
To exit a program without an error traceback you need to write a program that doesn't raise an exception. Or if it does raise an exception, provide an exception handler (as per Larz60+).

When I run your program like this:
import sys

def sum_two(a,b):
    if type(a) != int or type(b) != int:
        print('a and b must both be integers.')
        sys.exit()
    if a+b > 15 and a+b < 20:
        sum = 20
    else: sum = a+b
    return sum

sum_two(3.5, 6)
I do not get any mention of using exit or quit. I get this:
Output:
a and b must both be integers.
From the docs:

sys.exit([arg])
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.

The optional argument arg can be an integer giving the exit status (defaulting to zero), or another type of object. If it is an integer, zero is considered “successful termination” and any nonzero value is considered “abnormal termination” by shells and the like. Most systems require it to be in the range 0–127, and produce undefined results otherwise. Some systems have a convention for assigning specific meanings to specific exit codes, but these are generally underdeveloped; Unix programs generally use 2 for command line syntax errors and 1 for all other kind of errors. If another type of object is passed, None is equivalent to passing zero, and any other object is printed to stderr and results in an exit code of 1. In particular, sys.exit("some error message") is a quick way to exit a program when an error occurs.
Since exit() ultimately “only” raises an exception, it will only exit the process when called from the main thread, and the exception is not intercepted.

Changed in version 3.6: If an error occurs in the cleanup after the Python interpreter has caught SystemExit (such as an error flushing buffered data in the standard streams), the exit status is changed to 120.

My guess is there is something catching the SystemExit exception and generating the messages you are seeing. What are you using for development? I am running Python 3.8.2 on Windows 10. I would stop using sys.exit() (I never use it) and find a better way to handle the problem.

By the way, ou can write your comparison:
if a+b > 15 and a+b < 20:
    sum = 20
like this:
if 15 < a+b < 20:
    sum = 20
And though this is allowed, all style guidelines say you should never use it;
else: sum = a+b
I'm not sure how to use try/except, as Lars60+ suggested. The documentation says sys.exit raises a SystemExit exception and then exits. I want the exit but no further output. I don't understand why the first code exits without any coincident output, which is exactly what I want.

It seems to have worked seamlessly for you deanhystad. bowlofred also asked about the IDE. I'm running Python 3.7 in Spyder 4.2.0. Maybe it's specific to Spyder?

Thanks for the note about the style guidelines. What violated the style guidelines: using a colon to join two lines?

(Feb-24-2021, 05:20 PM)deanhystad Wrote: [ -> ]To exit a program without an error traceback you need to write a program that doesn't raise an exception. Or if it does raise an exception, provide an exception handler (as per Larz60+).

When I run your program like this:
import sys

def sum_two(a,b):
    if type(a) != int or type(b) != int:
        print('a and b must both be integers.')
        sys.exit()
    if a+b > 15 and a+b < 20:
        sum = 20
    else: sum = a+b
    return sum

sum_two(3.5, 6)
I do not get any mention of using exit or quit. I get this:
Output:
a and b must both be integers.
...
My guess is there is something catching the SystemExit exception and generating the messages you are seeing. What are you using for development? I am running Python 3.8.2 on Windows 10. I would stop using sys.exit() (I never use it) and find a better way to handle the problem.

By the way, ou can write your comparison:
if a+b > 15 and a+b < 20:
    sum = 20
like this:
if 15 < a+b < 20:
    sum = 20
And though this is allowed, all style guidelines say you should never use it;
else: sum = a+b
Yes on the colon. When I try that in Visual Studio code the computer raps my knuckles with a ruler.

Exiting out of a program from inside a function is usually a bad idea. Do you get the same message if you run your program outside of Spyder. IDLE is my tool of choice when answering questions on the forum. Sometimes IDLE doesn't work as expected, and when that happens I try running my programs from the command prompt or from Visual Studio Code.
Should I be able to run from the command line?

When I ran the file.py I initially got the print lines as output. I then entered sum_two(3.5,7) and got:
Output:
'sum_two' is not recognized as an internal or external command, operable program or batch file.
(Feb-24-2021, 05:51 PM)deanhystad Wrote: [ -> ]Yes on the colon. When I try that in Visual Studio code the computer raps my knuckles with a ruler.

Exiting out of a program from inside a function is usually a bad idea. Do you get the same message if you run your program outside of Spyder. IDLE is my tool of choice when answering questions on the forum. Sometimes IDLE doesn't work as expected, and when that happens I try running my programs from the command prompt or from Visual Studio Code.
(Feb-24-2021, 06:36 PM)Mark17 Wrote: [ -> ]Should I be able to run from the command line?

When I ran the file.py I initially got the print lines as output. I then entered sum_two(3.5,7) and got:
Output:'sum_two' is not recognized as an internal or external command,operable program or batch file.
You should be able to run the program from the command line, but not components within that program.