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

Python Fabric:处理异常,以便我可以在try块中捕获它,python,fabric,Python,Fabric,我正试图找到一种处理织物错误的方法 示例:如果我的远程主机因维护而停机,并且我的应用程序正在运行,试图对其进行一些操作,我会从Fabric中得到一个异常。这会阻止我的应用程序,并打印可怕的堆栈跟踪 为了避免这种情况,因为我需要知道主机何时停机,所以我使用try块将请求包装到remote,但我不确定应该在except块中放入什么,以便只捕获来自Fabric的异常(如networkError和类似的异常) 使用织物处理试块的正确方法是什么?或者更具体地说,我应该在“except”块中添加什么,这样它

我正试图找到一种处理织物错误的方法

示例:如果我的远程主机因维护而停机,并且我的应用程序正在运行,试图对其进行一些操作,我会从Fabric中得到一个异常。这会阻止我的应用程序,并打印可怕的堆栈跟踪

为了避免这种情况,因为我需要知道主机何时停机,所以我使用try块将请求包装到remote,但我不确定应该在except块中放入什么,以便只捕获来自Fabric的异常(如networkError和类似的异常)


使用织物处理试块的正确方法是什么?或者更具体地说,我应该在“except”块中添加什么,这样它将捕获来自fabric的任何异常,并避免整个应用程序退出并打印出堆栈错误?

那么您想知道什么时候以某种方式发生这种情况吗?捕获此异常(具有可能导致此情况的确切异常集,不要尝试捕获太多)并让它通过电子邮件或类似的方式发送给您,然后重新发送相同的异常,以便您知道发生了什么


编辑。不在屏幕上显示回溯是很容易的,但我不确定我建议完全避免回溯。实现日志记录是一个很好的选择,或者将回溯格式化为您想要的也是可以接受的。查看回溯模块日志记录。异常在捕获错误后将输出回溯:

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
还有一个:

默认值:无

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

给它一个callable,它接受一个字符串(可能已打印的错误消息)并返回一个异常实例。然后引发该异常对象,而不是SystemExit(sys.exit就是这样做的)

大多数情况下,您只需将其设置为异常类,因为这些异常类完全符合上述描述(可调用、获取字符串、返回异常实例)。例如env.abort_exception=MyExceptionClass


我主要希望避免在屏幕上打印堆栈,并避免应用程序停止。我可以对异常进行微调,但我主要希望捕获来自Fabric的异常,并从这里开始非常感谢!因此,我只尝试了warn_,但当我调用例如命令超时时,仍然会出现异常。我希望有一个全球性的方式来告诉Fabric不要提出例外。env.abort_异常似乎是一种可行的方法,但如果我理解正确的话,这意味着要编写一个带有异常实现的空类。是的,就是这样。您创建的类可能继承自
Exception
from fabric.api import settings

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