Python try块不会捕获os.system异常

Cin*_*der 18 python os.system try-catch except

我有这个python代码:

import os
try:
  os.system('wrongcommand')
except:
  print("command does not work")
Run Code Online (Sandbox Code Playgroud)

代码打印:

wrongcommand: command not found
Run Code Online (Sandbox Code Playgroud)

而不是command does not work.有谁知道为什么它不打印我的错误信息?

mgi*_*son 31

如果要在命令不存在时抛出异常,则应使用subprocess:

 import subprocess
 try:
     subprocess.call(['wrongcommand'])
 except OSError:
     print ('wrongcommand does not exist')
Run Code Online (Sandbox Code Playgroud)

想想看,你应该用subprocess而不是os.system反正...

  • 但用下面的代码修复了。`try: command = "java -jar {} -r {}".format(sikuli_jar, sikuli_script) subprocess.check_call(command) except (OSError, subprocess.SubprocessError, subprocess.CalledProcessError): raise ("\"{}\ " \"{}\" 其中之一丢失。".format(sikuli_jar, sikuli_script))` (2认同)

小智 15

因为os.system()通过方法的退出代码指示失败

  • 返回值= 0 - >一切都好
  • 返回值!= 0 - >有些错误

被调用命令的退出代码直接传递回Python.

有文档告诉你os.system()会在出现故障时引发一个exeption.os.system()只调用操作系统的underlaying system()调用并返回其返回值.

请阅读使用os.system()文档小心.


Sho*_*lle 11

尽管子流程可能是您最好的朋友。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")

Run Code Online (Sandbox Code Playgroud)


Jan*_*cke 5

您的代码片段中有两个问题。首先,永远不要只做try: ... except:,始终要具体说明您要处理的异常。否则,您的程序只会吞下任何类型的错误,包括您不期望的错误。在大多数情况下,这将导致在运行时的其他时间点出现意外行为。

此外,在os.system()大多数情况下,调用应该被subprocess模块中的对应调用替换。

要查看出了什么问题,请忽略 try/except 块并实际查看回溯/异常。正如其他人指出的那样,您会注意到您的情况没有例外,这就是为什么不打印自定义字符串的原因。

底线:考虑在您的代码块中可能发生哪些特定异常。仔细考虑一下,由于某些原因,您预计会发生哪些情况,并适当地处理这些情况。不要处理您不期望的那些。