打印Python异常类型(在Fabric中引发)

时间:2013-07-21 05:32:52

标签: python exception python-2.7 exception-handling

我正在使用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只是一个例子)。

谢谢!

5 个答案:

答案 0 :(得分:10)

问题是Fabric使用subprocess来做这些事情。如果查看local的源代码,可以看到它实际上没有引发异常。它调用suprocess.Popen并使用communicate()来读取stdout和stderr。如果存在非零返回码,则会返回对warnabort的调用。默认为中止。所以,要做你想做的事,试试这个:

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.

如果没有发生这种情况,你可能根本就没有例外。

如果您确实要捕获任意异常并打印它,则需要捕获ExceptionBaseExceptionBaseException甚至会包含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将具有完全相同的效果。

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