【问题标题】:How to capture error message in python that is not an exception?如何在python中捕获不是异常的错误消息?
【发布时间】:2020-09-02 10:28:22
【问题描述】:

我正在使用一个名为 pywaves 的模块与waves.exchange API 进行交互。问题是有时当我尝试下订单时,它会被拒绝并显示错误消息:

[ERROR] Order Rejected...

问题是如何在我的脚本中捕获此错误消息。产生错误的代码是: myOrder = myAddress.sell(assetPair = PRO_WAVES, amount = 1491999999, price = proprice1, matcherFee = 700000, maxLifetime = 3600) 该错误不会引发异常,也不会被捕获到myOrder 中。如何将此错误中的数据获取到变量中以便我可以使用它?

【问题讨论】:

  • 这看起来像一条日志消息,不一定会引发实际错误,你能显示完整的错误吗?
  • [ERROR] Order Rejected - 6GQkwHGyd769EghKQ6qXhAHG55JyaFjK7VGWEKSSg4Z8 的资产脚本返回错误:Sell price must be >= 1637850000 wavelets in Cycle #338。我的脚本需要访问错误消息以从中提取最低价格它。

标签: python


【解决方案1】:

库中的错误可能被写入标准错误输出sys.stderr。因此,您可以重定向错误输出并检查库是否正在写入。例如见this question on logging error output

一旦你有一个记录器(或者在你的情况下是一个记录和解析任何错误的类),就可以这样使用它:

import sys
_stderr = sys.stderr
sys.stderr = MyErrorCheckLogger()
try:
    myOrder = myAddress.sell(...)
finally:
    sys.stderr = _stderr

当然,您可以使用sys.stdout——标准输出通道做同样的事情。


编辑:这是一个完整的示例,我们可以捕获直接打印到标准输出 (stdout) 的任何错误消息。

import sys

class ErrorChecker:
    def __init__(self, output):
        self.output = output               # Save the original `stdout` (or `stderr`)
        self.buffer = ""                   # The buffer for the message printed

    def write(self, message):
        self.buffer += message             # Add any message to our buffer
        self.output.write(message)         # Print it as original intended

    def flush(self):
        self.output.flush()

def throwError(f, *args, **kwargs):
    sys.stdout = ErrorChecker(sys.stdout)  # Create a new output-stream with buffer
    try:
        result = f(*args, **kwargs)        # Execute the code that might cause an error
    finally:
        buffer = sys.stdout.buffer         # Get the output buffer
        sys.stdout = sys.stdout.output     # Restore the original 'stdout'
    if buffer.startswith("[ERROR]"):       # If the output is an error message, raise
        raise Exception(buffer)            # it as an actual exception
    return result

myOrder = throwError(myAddress.sell, assetPair = PRO_WAVES, amount = 1491999999, price = proprice1, matcherFee = 700000, maxLifetime = 3600)

【讨论】:

  • 我添加了这段代码,并且输出是相同的...我将使用什么变量来访问错误消息以从中提取最低售价:[错误]订单被拒绝 - 资产的6GQkwHGyd769EghKQ6qXhAHG55JyaFjK7VGWEKSSg4Z8 的脚本返回错误:在第 338 周期中,卖出价格必须 >= 1637850000 个小波。
【解决方案2】:

通读the actual code 后,appears 可以使用pywaves.setThrowOnError() 在记录错误时引发异常,例如in the situation you describe。但是,无论出于何种原因doesn't appear to be documented,因此使用风险自负。您可以use the issue tracking system与开发者沟通。

【讨论】:

  • 文档看起来很粗略。很难理解为什么会有 setThrowOnError 函数,除非它是作为公共 API 的。 (它似乎没有被任何其他模块在内部使用)。
猜你喜欢
  • 1970-01-01
  • 2011-06-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
相关资源
最近更新 更多