我正在使用Fabric进行自动化,包括创建目录的任务。这是我的fabfile.py:
#!/usr/bin/env python
from fabric.api import *
def init():
try:
local('mkdir ./www')
except ##what exception?##:
#print exception name to put in above
运行fab fabfile.py
并且我已经创建了./www
错误,但我不知道是什么类型,所以我不知道如何处理错误。 Fabric仅打印出以下内容:
mkdir: cannot create directory ‘./www’: File exists
Fatal error: local() encountered an error (return code 1) while executing 'mkdir ./www'
Aborting.
我想要做的是能够找出错误类型,这样我就可以在没有一揽子陈述的情况下正确地解决错误。如果答案不只是告诉我如何处理mkdir
异常,而是打印(或以其他方式找到名称)任何异常,我可能遇到的问题会非常有用(mkdir只是一个例子)。
谢谢!
答案 0 :(得分:10)
问题是Fabric使用subprocess来做这些事情。如果查看local
的源代码,可以看到它实际上没有引发异常。它调用suprocess.Popen并使用communicate()
来读取stdout和stderr。如果存在非零返回码,则会返回对warn
或abort
的调用。默认为中止。所以,要做你想做的事,试试这个:
def init():
with settings(warn_only=True):
local('mkdir ./www')
如果您查看abort
的来源,它看起来像这样:
10 def abort(msg):
21 from fabric.state import output
22 if output.aborts:
23 sys.stderr.write("\nFatal error: %s\n" % str(msg))
24 sys.stderr.write("\nAborting.\n")
25 sys.exit(1)
因此,异常将是SystemExit异常。虽然您可以捕捉到这一点,但上面使用settings
概述了执行此操作的正确方法。
答案 1 :(得分:3)
没有什么可以处理异常,它来自fabric api
尝试使用
将整个脚本的warn_only设置为true env.warn_only = True
答案 2 :(得分:0)
通常,当您收到未捕获的异常时,Python将打印异常类型以及错误消息:
>>> raise IOError("Error message.")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IOError: Error message.
如果没有发生这种情况,你可能根本就没有例外。
如果您确实要捕获任意异常并打印它,则需要捕获Exception
或BaseException
。 BaseException
甚至会包含KeyboardInterrupt
之类的内容,所以要小心。
def init():
try:
local('mkdir ./www')
except BaseException as e:
print "local() threw a", type(e).__name__
raise # Reraise the exception
答案 3 :(得分:-1)
def init():
try:
local('mkdir ./www')
except Exception as e:
print e.__class__.__name__
这就是它的全部!
编辑:重新阅读您的问题,并意识到我的代码只会在您的情况下打印“致命”。看起来Fabric似乎抛出错误并返回自己的错误代码,因此您必须查看文档。我对面料没有任何经验,所以如果您还没有,我建议您查看here。对不起,如果这没用!
答案 4 :(得分:-1)
一般来说:
try:
some_code()
except Exception, e:
print 'Hit An Exception', e
raise
将告诉你异常是什么,但如果你不打算实际处理部分异常,那么只需删除try:except:lines将具有完全相同的效果。
此外,如果您在调试器下运行代码,那么您可以查看更详细的异常。