Блок 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")