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

mh0*_*00h 5 python exception-handling exception python-2.7

我正在使用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
Run Code Online (Sandbox Code Playgroud)

运行fab fabfile.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.
Run Code Online (Sandbox Code Playgroud)

我想要做的是能够找出错误类型,以便我可以正确地除了我的错误没有一揽子陈述.如果答案不只是告诉我如何处理mkdir异常,而是打印(或以其他方式找到名称)我可能遇到的任何异常(mkdir只是一个例子),这将非常有用.

谢谢!

sbe*_*rry 10

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

def init():
    with settings(warn_only=True):
        local('mkdir ./www')
Run Code Online (Sandbox Code Playgroud)

如果您查看源代码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)
Run Code Online (Sandbox Code Playgroud)

因此,异常将是SystemExit异常.虽然你可以抓住这个,但上面概述了使用它的正确方法settings.

  • 如果它保存了其他人的Google搜索:从fabric.api导入设置 (2认同)