Блок try на Python не захватывает исключения os.system
У меня есть этот код python:
import os
try:
os.system('wrongcommand')
except:
print("command does not work")
Код печатает:
wrongcommand: command not found
Вместо command does not work
. Кто-нибудь знает, почему он не печатает мое сообщение об ошибке?
Ответы
Ответ 1
Если вы хотите создать исключение, если команда не существует, вы должны использовать subprocess
:
import subprocess
try:
subprocess.call(['wrongcommand'])
except OSError:
print ('wrongcommand does not exist')
Подумайте об этом, вы должны использовать subprocess
вместо os.system
в любом случае...
Ответ 2
Поскольку os.system() указывает на сбой через код выхода метода
- return value = 0 → all ok
- возвращаемое значение!= 0 → некоторая ошибка
Код завершения вызываемой команды напрямую передается обратно на Python.
Существует документация, сообщающая вам, что os.system() будет вызывать освобождение в случае сбоя. os.system() просто вызывает вызов системы подсистемы() операционной системы и возвращает возвращаемое значение.
Пожалуйста, внимательно прочитайте документацию os.system().
Ответ 3
В фрагменте кода есть две проблемы. Прежде всего, никогда не делайте try: ... except:
, всегда указывайте, какое исключение вы хотите обработать. В противном случае ваша программа просто проглатывает любую ошибку, а также те, которых вы не ожидаете. В большинстве случаев это приведет к неожиданному поведению в какой-то другой точке во время выполнения.
Кроме того, вызовы os.system()
чаще всего заменяются их аналогами из модуля subprocess
.
Чтобы узнать, что пойдет не так, оставьте блок try/except и посмотрите на traceback/exception. Как указывали другие, вы заметите, что в вашем случае нет исключения, поэтому ваша пользовательская строка не печатается.
Нижняя строка: подумайте о том, какие конкретные исключения могут произойти в вашем блоке кода. Подумайте о том, из какого из них вы ожидаете, что это произойдет по определенным причинам и соответствующим образом обработайте их. Не обрабатывайте те, которые вы не ожидаете.
Ответ 4
wrongcommand: command not found
- это вывод команды os.system
, используемой для вызова команды. os.system
не выбрасывал исключение
EDIT: отредактировано копией и вставкой части комментария mgilson
Ответ 5
Хотя подпроцесс может быть вашим лучшим другом. os.system все еще полезна где-то, особенно для программиста, играющего в режиме C/C++.
Следовательно, код будет ниже.
import os
try:
os_cmd = 'wrongcommand'
if os.system(os_cmd) != 0:
raise Exception('wrongcommand does not exist')
except:
print("command does not work")