2016-10-11 65 views
1

我想運行一個方法我知道這個方法不起作用,我想獲取方法返回的錯誤。龍捲風如何返回錯誤異常?

這是我的代碼:

def is_connect(s): 
    print("ok connection") 
    print(s) 
    ioloop.stop() 


try: 


    current_job_ready = 0 
    print("ok1") 
    beanstalk = beanstalkt.Client(host='host', port=port) 

    print("ok1") 
    beanstalk.connect(callback=is_connect) 


    ioloop = tornado.ioloop.IOLoop.instance() 
    ioloop.start() 
    print("ok2") 
except IOError as e: 
    print(e) 

這是我當我運行我的程序與扭絞端口錯誤:

WARNING:tornado.general:Connect error on fd 7: ECONNREFUSED 
ERROR:tornado.application:Exception in callback <functools.partial object at 0x7f5a0eac6f18> 
Traceback (most recent call last): 
    File "/usr/local/lib/python2.7/dist-packages/tornado/ioloop.py", line 604, in _run_callback 
    ret = callback() 
    File "/usr/local/lib/python2.7/dist-packages/tornado/stack_context.py", line 275, in null_wrapper 
    return fn(*args, **kwargs) 
    File "/usr/local/lib/python2.7/dist-packages/tornado/ioloop.py", line 619, in <lambda> 
    self.add_future(ret, lambda f: f.result()) 
    File "/usr/local/lib/python2.7/dist-packages/tornado/concurrent.py", line 237, in result 
    raise_exc_info(self._exc_info) 
    File "/usr/local/lib/python2.7/dist-packages/tornado/gen.py", line 270, in wrapper 
    result = func(*args, **kwargs) 
TypeError: connect() takes exactly 1 argument (2 given) 

我想擁有電子當我輸入一個錯誤的端口或主機。 我該怎麼做? 我累加raise IOError("connection error")beanstalk = beanstalkt.Client(host='host', port=port)但是這個強制錯誤,我只是想在它存在的時候出錯。

+0

你能發佈完整的代碼嗎? – Simon

+0

@Simon,我的代碼的其餘部分不涉及這部分。 – wxcvbn

+0

好的。那部分呢?缺少完整的陳述。 – Simon

回答

1

閱讀代碼有助於閱讀。在beanstalkt 0.6的connect,它創建了一個iostream的連接到服務器:

https://github.com/nephics/beanstalkt/blob/v0.6.0/beanstalkt/beanstalkt.py#L108

它註冊你的回調被成功執行,但如果連接失敗,它會只需要調用Client._reconnect每秒一次永遠。我想你應該在他們的GitHub項目中打開一個功能請求,詢問connect的錯誤通知系統。使用當前beanstalkt實現,你只需要決定你願意等待多長時間成功:

import sys 
from datetime import timedelta 

from tornado.ioloop import IOLoop 

def is_connect(s): 
    print("ok connection") 
    print(s) 
    loop.remove_timeout(timeout) 
    # Do something with Beanstalkd.... 

def connection_failed(): 
    print(sys.stderr, "Connection failed!") 
    # Could call IOLoop.stop() or just quit. 
    sys.exit(1) 

loop = IOLoop.current() 
timeout = loop.add_timeout(timedelta(seconds=1), connection_failed) 
beanstalk.connect(callback=is_connect) 
loop.start() 
+0

非常感謝它的完美運作! – wxcvbn

+0

@A。傑西Jiryu戴維斯嘿,你能幫我解決這個問題嗎? http://stackoverflow.com/questions/40629057/run-worker-beanstalkt-tornado-in-docker-container – John