我有一些运行Windows命令的Python 2.7代码。如果命令成功,则返回输出。 (更具体地说,它在多行输出中搜索搜索词,然后返回具有该搜索词的行。)
如果命令失败,它只返回“错误”
我想修改此代码以返回实际的错误消息。如何使我的函数的“异常”部分返回命令输出的实际错误消息?
def myFunction(machineName):
try:
output = subprocess.check_output('command ' + machineName)
for line in output.split('\n'):
if 'TextToSearchFor' in line:
return line
except subprocess.CalledProcessError:
return "Error"
return
答案 0 :(得分:0)
设置并获取subprocess.CalledProcessError.message
。这样就可以在没有处理错误的情况下显示消息,如果其他程序员有可能使用此异常,则可以很好地编程。
答案 1 :(得分:0)
文档实际上有an example:在通话中使用stderr=subprocess.STDOUT
。
它还提到subprocess.CalledProcessError有一个output
属性,其中包含进程的任何输出(我假设这是stdout
,但也许stderr
,在这种情况下你不需要在呼叫本身中设置stderr
。
因此,您应该可以使用(未经测试):
try:
output = subprocess.check_output('command ' + machineName)
for line in output.split('\n'):
if 'TextToSearchFor' in line:
return line
except subprocess.CalledProcessError:
print subprocess.CalledProcessError.output
return "Error"
return
答案 2 :(得分:0)
您可以使用例外:
def myFunction(machineName):
try:
output = subprocess.check_output('command ' + machineName)
for line in output.split('\n'):
if 'TextToSearchFor' in line:
return line
except Exception, e:
print e
return "Error"
return
如果您对堆栈跟踪感兴趣,可以执行以下操作:
import trace
除了Exception,e:你可以添加
traceback.print_exc()
答案 3 :(得分:0)
注意 - 您捕获的异常不是您可能期望的唯一例外:
>>> import subprocess
>>> try:
... output = subprocess.check_output("nosuch")
... except Exception as e:
... print str(e)
...
[Errno 2] No such file or directory
>>> e
OSError(2, 'No such file or directory')
>>> type(e)
<type 'exceptions.OSError'>
另请注意,函数的接口意味着您必须对错误进行特定检查,从而导致逻辑失去清晰度,因为每个调用必须如下所示:
result = myFunction(someArg):
if result.startswith("error"):
# handle issue somehow
else:
# normal logic flow to do something with result
通过从函数中删除错误检查并在调用时处理结果异常,在适当的位置处理异常实际上要简单得多。您的代码将如下所示
try:
# normal logic flow to do something with result
except (tuple, of, exceptions) as e:
# handle issue somehow
另请注意,异常可以转换为dtrings,这通常会为您提供任何相关的错误消息,如开头示例中所示,这样就可以解答您的问题。
如果你的Python足够新,你应该使用except ... as name:
格式而不是except ..., name:
,因为它将不加改变地迁移到Python 3。