在asyncore类中捕获异常

2 投票
1 回答
2193 浏览
提问于 2025-04-18 06:21

我正在用Python实现一个基于asyncore的IRC机器人,但在处理asyncore分发类中的方法时,遇到了捕获异常的问题。下面是我的一个简单示例:

#!/usr/bin/env python
import asyncore
import socket
import sys

class foo (asyncore.dispatcher):
    def __init__ (self, host, port):
        asyncore.dispatcher.__init__ (self)
        self.create_socket (socket.AF_INET, socket.SOCK_STREAM)
        self.connect ((host, port))

def handle_exception(excType, excValue, trace):
    print "Blah! Exception!"
    quit()

sys.excepthook = handle_exception
foo ("127.0.0.1", 19991)
asyncore.loop()

这个示例试图连接到127.0.0.1:19991,但那里没有任何服务,所以会出现连接被拒绝的错误,并抛出一个异常。问题在于,sys.excepthook,也就是handle_exception函数,似乎没有捕获到这个异常:

error: uncaptured python exception, closing channel <__main__.foo 127.0.0.1:19991 at
0x7fad23eaeab8> (<class 'socket.error'>:[Errno 111] Connection refused [/usr/lib/python2.7
/asyncore.py|read|83] [/usr/lib/python2.7/asyncore.py|handle_read_event|446] [/usr/lib/python2.7
/asyncore.py|handle_connect_event|454])

如果我在调用foo("127.0.0.1", 19991)之前加上像1/0这样的代码,异常处理器就能正常工作。那么,有没有办法让异常处理函数捕获到asyncore类内部发生的异常呢?如果可以的话,应该怎么做?这是在Python v2.7.6下的情况。

1 个回答

4

重写 dispatcherhandle_error 方法。

撰写回答