Fabric:处理异常,所以我可以在try块中捕获它

时间:2015-03-03 23:22:32

标签: python fabric

我正在尝试找到一种处理Fabric错误的方法。

示例:如果我的远程主机停机进行维护,并且我的应用程序正在运行,尝试完成一些工作,我从Fabric获得了一个例外。这会阻止我的应用程序,并打印出可怕的堆栈跟踪。

为了避免这种情况,因为我需要知道主机何时关闭,我将请求包装到远程,使用try块,但我不确定应该在except块中放入什么,以仅捕获异常来自Fabric(如networkError等)。

使用Fabric处理try-except块的正确方法是什么?或者更具体地说,我在"中除了"阻止,所以它将捕获来自结构的任何异常,并避免让整个应用程序退出并打印出堆栈错误?

2 个答案:

答案 0 :(得分:4)

捕获错误后,

logging.exception将输出回溯:

import logging

try:
    1/0
except Exception as e:
    logging.exception(e)

ERROR:root:division by zero
Traceback (most recent call last):
  File "/home/padraic/Dropbox/python/py3/size.py", line 105, in <module>
    1/0
ZeroDivisionError: division by zero

Process finished with exit code 0

如果您查看文档中的failure-handling,您会看到您可以使用上下文管理器仅在您获得非零退出状态时发出警告。

  

构建任务列表后,Fabric将按照执行策略中的说明开始执行它们,直到所有任务都在其整个主机列表上运行。但是,Fabric默认为“失败快速”行为模式:如果出现任何问题,例如远程程序返回非零返回值或fabfile的Python代码遇到异常,执行将立即停止。

     

这通常是所需的行为,但规则有很多例外,因此Fabric提供了env.warn_only,一个布尔设置。它默认为False,这意味着错误条件将导致程序立即中止。但是,如果在失败时将env.warn_only设置为True - 例如设置上下文管理器 - Fabric将发出警告消息但仍继续执行。

from fabric.api import settings

with settings(warn_only=True):
    p = run('sudo foo')
    if p.return_code ==  0:
       ...
    elif p.return_code ==  1:
       ....

还有env.abort_exception

默认值:无

  

Fabric通常通过向stderr打印错误消息并调用sys.exit(1)来处理中止。此设置允许您覆盖该行为(当env.abort_exception为None时会发生这种情况。)

     

给它一个callable,它接受一个字符串(本来会打印的错误信息)并返回一个异常实例。然后引发该异常对象而不是SystemExit(这是sys.exit所做的。)

     

大多数情况下,您只想将其设置为异常类,因为它们完全符合上述描述(可调用,接受字符串,返回异常实例)。 env.abort_exception = MyExceptionClass。

答案 1 :(得分:1)

所以你想知道这种情况何时发生?如何捕获此异常(具有可能导致此异常的确切异常集,不要试图捕获太多)并让它通过电子邮件发送给您或类似的东西并重新引用相同的异常,以便您知道发生了什么。

编辑。很容易在屏幕上没有回溯显示,但我不确定我建议完全避免回溯。实现日志记录是一个很好的选择,或者将回溯格式化为您想要的也是可以接受的。查看回溯模块https://docs.python.org/2/library/traceback.html