2016-10-11 67 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