Python try block does not catch os.system exceptions
Solution 1
If you want to have an exception thrown when the command doesn't exist, you should use subprocess
:
import subprocess
try:
subprocess.run(['wrongcommand'], check = True)
except subprocess.CalledProcessError:
print ('wrongcommand does not exist')
Come to think of it, you should probably use subprocess
instead of os.system
anyway ...
Solution 2
Because os.system() indicates a failure through the exit code of the method
- return value == 0 -> everything ok
- return value != 0 -> some error
The exit code of the called command is directly passed back to Python.
There is documentation telling you that os.system() would raise an exeption in case of a failure. os.system() just calls the underlaying system() call of the OS and returns its return value.
Please read the os.system() documentation carefully.
Solution 3
Although subprocess might be your best friend. os.system is still useful in somewhere, especially to the programmer play C/C++ mode.
Hence, the code will be below.
import os
try:
os_cmd = 'wrongcommand'
if os.system(os_cmd) != 0:
raise Exception('wrongcommand does not exist')
except:
print("command does not work")
Solution 4
There are two problems in your code snippet. First of all, never just do try: ... except:
, always be specific about which exception you want to handle. Otherwise, your program simply swallows any kind of error, also those that you do not expect. In most cases, this will lead to unexpected behavior at some other point during runtime.
Furthermore, os.system()
calls should most of the time be replaced by their counterparts from the subprocess
module.
To see what goes wrong, leave out the try/except block and actually look at the traceback/exception. As others have pointed out, you will notice that there is no exception in your case which is why your custom string is not printed.
Bottom line: think about which specific exceptions can occur in your code block. Think hard about which of them you expect to happen for certain reasons and handle those appropriately. Do not handle those that you do not expect.
Solution 5
wrongcommand: command not found
is the output of the shell os.system
is using to invoke the command. os.system
did not throw an exception
EDIT: edited by copy-and-pasting part of mgilson's comment
Comments
-
Cinder almost 3 years
I have this python code:
import os try: os.system('wrongcommand') except: print("command does not work")
The code prints:
wrongcommand: command not found
Instead of
command does not work
. Does anyone know why it's not printing my error message? -
Cinder over 11 yearsthanks, but how do you catch it in python? is it even possible?
-
Dr. Jan-Philip Gehrcke over 11 yearsYes, but not using
os.system()
. This is one reason why you should use thesubprocess
module, as outlined in @mgilson's answer. -
mgilson over 11 yearsMore specifically,
wrongcommand: command not found
is the output of the shell thatos.system
is using to invoke the command. (a different shell with a differentPATH
might find the command). -
Shiva Krishna Chippa over 4 yearsMy command is for running a .jar file. When I run the correct command with square braces the above snippet still showing the exception. When I run the wrong command without square braces the above snippet not showing the exception. How to handle this?
-
mgilson over 4 yearsWhat does your command look like? I suspect that you want something like:
subprocess.call(["java", "-jar", "yourjar.jar"])
-
Shiva Krishna Chippa over 4 years
sikuli_jar = "C:\\sikulix.jar" sikuli_script = "C:\\Sikuli.sikuli" try: command = "java -jar {} -r {}".format(sikuli_jar, sikuli_script) subprocess.call([command]) except OSError: raise ("\"{}\" \"{}\" one of these is missing.".format(sikuli_jar, sikuli_script))
With the above I was facing problem. -
Shiva Krishna Chippa over 4 yearsBut fixed with below code.
try: command = "java -jar {} -r {}".format(sikuli_jar, sikuli_script) subprocess.check_call(command) except (OSError, subprocess.SubprocessError, subprocess.CalledProcessError): raise ("\"{}\" \"{}\" one of these is missing.".format(sikuli_jar, sikuli_script))
-
Anu over 3 years@ShivakrishnaChippa, can you add your answer as an
EDIT:
to your question! It would be easier to read instead of what's in the comment! -
Eric Nelson almost 3 yearsWith SSH keys in place, when invoked with
subprocess.call()
,rsync
asks for a password, but does not ask when invoked withos.system()
. Did I miss something?