5

我正在使用 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

运行 fabfabfile.py和 f 我已经./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 只是一个示例),那将非常有帮助。

谢谢!

4

5 回答 5

10

问题是面料使用子流程来做这些事情。如果您查看源代码,local您会发现它实际上并没有引发异常。它调用 suprocess.Popen 并用于communicate()读取 stdout 和 stderr。如果有一个非零的返回码,那么它会返回一个对warnor的调用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.

于 2013-07-21T05:42:59.123 回答
3

没什么可处理的,它来自fabric api

尝试将整个脚本的 warn_only 设置设置为 true

  env.warn_only = True
于 2013-07-21T05:54:26.550 回答
0

通常,当您遇到未捕获的异常时,Python 将打印异常类型以及错误消息:

>>> raise IOError("Error message.")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IOError: Error message.

如果这没有发生,那么您可能根本没有遇到异常。

如果您真的想捕获任意异常并打印它,您需要捕获ExceptionBaseException. BaseException甚至会包括类似的东西KeyboardInterrupt,所以要小心。

def init():
try:
    local('mkdir ./www')
except BaseException as e:
    print "local() threw a", type(e).__name__
    raise # Reraise the exception
于 2013-07-21T05:41:59.303 回答
-1
def init():
    try:
        local('mkdir ./www')
    except Exception as e:
        print e.__class__.__name__

这里的所有都是它的!

编辑:只需重新阅读您的问题并意识到我的代码只会在您的情况下打印“致命”。看起来fabric正在抛出一个错误并返回他们自己的错误代码,所以你必须查看文档。我对面料没有任何经验,所以如果你还没有的话,我建议你看看这里。对不起,如果这没有帮助!

于 2013-07-21T05:37:50.897 回答
-1

一般来说:

    try:
        some_code()
    except Exception, e:
        print 'Hit An Exception', e
        raise

将告诉您异常是什么,但如果您不打算实际处理一些异常,那么只需摆脱 try: except: 行将具有完全相同的效果。

此外,如果您在调试器下运行代码,那么您可以更详细地查看您遇到的异常。

于 2013-07-21T05:43:41.483 回答