Перехват исключений в асинхронных классах
Я внедряю IRC-бот, основанный на асинхронности, в Python, и у меня возникают проблемы с перехватом исключений, возникающих в методах классов, отправляемых асинхронно. Вот мой минимальный пример:
#!/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])
Если я помещу что-то вроде 1/0 перед вызовом foo ("127.0.0.1", 19991), обработчик исключений будет работать как положено. Можно ли заставить функцию обработчика исключений перехватывать исключения, которые происходят внутри асинхронных классов? Если так, то как? Это с Python v2.7.6.
1 ответ
Решение