2017-03-02 49 views
0

我使用雙絞線Python和有一些代碼基本上是這樣的:扭曲reactor.callLater()在儘量不陷入惟獨在某些機器

class TimeoutException(Exception): 
    pass 


def timeout(msg): 
    raise TimeoutExpection(msg) 

def create_timeout(len, msg): 
    return reactor.callLater(len, timeout, msg) 

在其他地方的代碼...

try: 
    timeout_call = create_timeout(10, "timeout") 
    db_res = yield some_large_io_request() 
except Exception as e: 
    print e 
    raise web.HTTPError(408) # cyclone error 
else: 
    if timeout_call.active(): 
     timeout_call.cancel() 

這是運行在一個Docker容器中,但是在某些機器上,其他的嘗試除了工作,對於TimeoutException類型,我得到一個未處理的錯誤,但是我仍然得到了一個408.目前還不清楚如何/爲什麼它是間歇性的,有什麼想法?

+0

這些片段是不完整的片段。當這段代碼運行時,你希望發生什麼?爲什麼?你觀察到什麼發生了(確切地說 - 報價日誌,最好)?如果您可以使片段更完整,那也會很棒(例如,我猜*您正在使用'inlineCallbacks',但您在問題中沒有提到這一點)。 –

+0

我期待嘗試,除了捕捉異常,並沒有得到未處理的錯誤。是的,我使用'inlineCallbacks',但這不是代碼的重要組成部分,您可以刪除該行,它仍然是相同的行爲,這只是更現實的。 –

+0

捕捉什麼異常? –

回答

0

reactor.callLater立即返回。它所做的唯一事情就是安排一個函數,以便在事件循環的將來某個時候調用。

考慮:

from twisted.internet.task import react 
from twisted.internet.defer import Deferred 

def foo(): 
    raise Exception("oh no") 

def main(reactor): 
    try: 
     call = reactor.callLater(0, foo) 
    except: 
     print("Handling an exception!") 
    else: 
     print("Not handling an exception at all.") 
     print("Got {}".format(call)) 
    print("Goodbye.") 
    return Deferred() 

react(main, []) 

這個程序總是產生這樣的輸出:

Not handling an exception at all. 
Got <DelayedCall 0x7fd082e28758 [-3.71932983398e-05s] called=0 cancelled=0 foo()> 
Goodbye. 
Unhandled Error 
Traceback (most recent call last): 
    File "/tmp/junk.py", line 18, in <module> 
    react(main, []) 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/task.py", line 936, in react 
    _reactor.run() 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1195, in run 
    self.mainLoop() 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 1204, in mainLoop 
    self.runUntilCurrent() 
--- <exception caught here> --- 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/base.py", line 825, in runUntilCurrent 
    call.func(*call.args, **call.kw) 
    File "/tmp/junk.py", line 5, in foo 
    raise Exception("oh no") 
exceptions.Exception: oh no 

所以,你永遠不能使用try/except來處理由您計劃使用callLater功能引起的異常。