2016-06-07 81 views
0

我正在用Twisted Klein开发一个异步Web服务。有部分的代码如下:如何避免python中的yield命令每次都会抛出异常?

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

我有这个test功能我的web服务的一部分,每次我打电话从其他功能返回“无” test功能。但是,在服务器屏幕上,它会打印出我想要的正确结果(尝试中的print result行正确执行,而不使用returnValue(result))。我对异步编码不是很熟悉,但是除了yield之外,还有什么我应该小心尝试吗?谢谢。

+3

?您应该捕获您期望的特定异常类型。我对Twisted Klein了解不多,但Google的一个快速搜索表明他们[使用例外来模拟协程](http://tavendo.com/blog/post/going-asynchronous-from-flask-to-twisted -klein /),所以一个光秃秃的'except'会很难完成。 – user2357112

+0

所以我从瓶子代码修改了这个,并且我调用了一个可能会抛出异常的API,我不希望它崩溃,所以我使用try /除非这样做。也许我应该删除那裸露的除外,看看它是如何工作的? – JLTChiu

+0

除了裸露之外,它实际上起作用了。我想我需要从api中指定所有可能的异常。我希望标签为正确的答案,但你在评论中 – JLTChiu

回答

2

首先,你永远不应该有一个光秃秃的except条款。 (也有例外,但总体来讲它更好地捕获特定的错误。)

其次,从扭曲的文档上的returnValue:

注:这是目前通过提高从BaseException派生的异常实现。您可能想将任何'except:'子句更改为'except:'子句,以免发生此异常。

此外:虽然此函数当前将在从生成器内调用的任意函数内调用时起作用,但请不要依赖此行为。

发生了什么事是你正确的结果是印刷,然后调用returnValue,这引发了异常,从而导致你的代码你为什么要使用裸`except`返回None

twisted docs