Python子进程模块 - 引发未知异常

时间:2014-06-12 17:52:07

标签: python linux exception module

我在其中一台服务器上从Python 2.6中的子进程模块中获取了一个未知异常。

想要一些帮助在这里找到问题

运行代码:

ret = u.run('''echo''')

u.run来自这里:

def run(cmd):
  cmd = '(' + cmd + ') 2>&1';
  info("Trying to run : " + cmd)
  try:
    ret = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
    return ret
  except subprocess.CalledProcessError, e:
    die("Error - Output:\n" + e.output + "\nExternal cmd return code: " + str(e.returncode) + "\nFor command: " + e.cmd)
  except:
    die("Unknown error running:\n" + cmd)

我的输出是这样的:

Trying to run : (echo) 2>&1
DIE: Unknown error running:
(echo) 2>&1

任何想法是什么“未知错误?”除了CalledProcessError

之外,没有针对子进程记录的异常

1 个答案:

答案 0 :(得分:1)

优良作法是捕捉异常,但像这样的全能except会让许多程序员想要打破你的手指非常不开心,因为Unknown error running: (echo) 2>&1无助于所有。之所以没有关于"未知错误"是因为你打印的全部。

有两个解决方案:让Python自己引发异常(所以你有一个回溯并且可以找出你出错的地方)或者上面提到的@dano,在你的处理程序中打印实际的异常,如下所示:

def run(cmd):
  cmd = '(' + cmd + ') 2>&1';
  info("Trying to run : " + cmd)
  try:
    ret = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True)
    return ret
  except subprocess.CalledProcessError, e:
    die("Error - Output:\n" + e.output + "\nExternal cmd return code: " + str(e.returncode) + "\nFor command: " + e.cmd)
  except Exception as e:
    die("Uncaught error: " + str(e) + '\nrunning:\n' + cmd)

这将告诉您错误是什么,以便您可以修复它(如果是编程错误)或为导致问题的任何内容创建特定的错误处理程序。