2016-06-07 26 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