【问题标题】:How to avoid yield command in python throws exceptions every time?如何避免python中的yield命令每次都抛出异常?
【发布时间】:2016-06-07 17:44:28
【问题描述】:

我正在使用 Twisted Klein 开发异步 Web 服务。部分代码如下:

@inlineCallbacks
def test(input1): 
    try:
        result = yield function(input1)
        print result
        returnValue(result)
    except:
        returnValue("None")
        pass

我将这个test 函数作为我的Web 服务的一部分,每次我从其他函数调用test 函数时都返回“无”。但是,在服务器屏幕上,它会打印出我想要的正确结果(try 中的print result 行已正确执行,只是未使用returnValue(result))。我对异步编码不是很熟悉,但是除了与yield一起尝试之外,还有什么我应该小心的吗?谢谢。

【问题讨论】:

  • 你为什么使用一个裸露的except?您应该捕获您期望的特定异常类型。我对 Twisted Klein 了解不多,但是通过 Google 快速搜索显示它们是 using exceptions to simulate coroutines,所以一个裸露的 except 会很难搞定。
  • 所以我从一个烧瓶代码修改了这个,我正在调用一个可能会抛出异常的 api,我不希望它崩溃,所以我使用 try/except 来做到这一点。也许我应该删除那个裸露的除外,看看它是如何工作的?
  • 在我删除了裸露的除外之后它实际上工作了。我想我需要从 api 中指定所有可能的异常。我希望将您标记为正确答案,但您在评论中

标签: python twisted klein-mvc


【解决方案1】:

首先,您永远不应该有一个裸露的except 子句。 (也有例外,但一般来说,捕获特定错误会更好。)

第二,来自关于 returnValue 的扭曲文档:

注意:目前这是通过引发从 BaseException 派生的异常来实现的。您可能希望将任何 'except:' 子句更改为 'except Exception:' 子句,以免捕获此异常。

另外:虽然这个函数目前可以在从生成器中调用的任意函数中调用时工作,但不要依赖这种行为。

您的正确结果是打印,然后您调用returnValue,这会引发异常,导致您的代码返回None

twisted docs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多