2015-06-09 2 views
0

Мой главный класс что-то вродеPython витой не ловить исключение

# file bmdaemon.py 
from txjsonrpc.web import jsonrpc 
from twisted.web import server, xmlrpc 
from twisted.internet import reactor, defer, threads, task 
import xmlrpclib 
from txjsonrpc.web.jsonrpc import Proxy 


class BMDaemon(jsonrpc.JSONRPC): 
    # class definition 


class XmlRpcInterface(xmlrpc.XMLRPC): 
    # class definition 


if __name__ == "__main__": 
    try: 
     bm_daemon = BMDaemon() 
     xml_interface = XmlRpcInterface() 
     portJSONRPC = bm_daemon.get_listeningJSON_port() 
     portXMLRPC = bm_daemon.get_listeningXML_port() 
     reactor.listenTCP(portJSONRPC, server.Site(bm_daemon)) 
     reactor.listenTCP(portXMLRPC, server.Site(xml_interface)) 
     reactor.run() 
    except KeyboardInterrupt: 
     print "MAIN: ^C received, exiting." 

И я просто пытаюсь поймать CTRL+C на внешнем уровне, то есть «основной» исполнения.

Однако отправка упомянутый клавиатуры прерывают просто печатает

<< prints from BMDaemon >> 
^CUnhandled error in Deferred: 
Unhandled Error 
Traceback (most recent call last): 
    File "bmdaemon.py", line 562, in <module> 
    bm_daemon = BMDaemon() 
    File "bmdaemon.py", line 114, in __init__ 
    << some line >> 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/task.py", line 170, in start 
    self() 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/task.py", line 215, in __call__ 
    d = defer.maybeDeferred(self.f, *self.a, **self.kw) 
--- <exception caught here> --- 
    File "/usr/lib/python2.7/dist-packages/twisted/internet/defer.py", line 134, in maybeDeferred 
    result = f(*args, **kw) 
    File "bmdaemon.py", line 519, in __registration 
    << some line >> 
    File "/usr/lib/python2.7/commands.py", line 60, in getstatusoutput 
    text = pipe.read() 
exceptions.KeyboardInterrupt: 
<< prints from XmlRpcInterface >> 

Другими словами, я не поймать запрашиваемую ошибку! Пожалуйста, будьте терпеливы, так как я пришел из среды Java, где такая ситуация была бы намного понятнее.

+0

Может ли быть что-то в BMDaemon, есть обработчик исключений, которому присваивается приоритет, потому что он находится внутри класса? Я бы прокомментировал большую часть кода, чтобы отслеживать его, но я не слишком хорошо отлаживаю;). – Jblasco

+0

Думаю, ты прав. Код на самом деле полон 'except Exception, e:', который маскирует все и останавливает желаемый поток. Благодарю. –

ответ

2

Вы пробовали минимальный пример? Как это:

import time 
def sleeper(): 
    while(True): 
     print "So sleepy" 
     time.sleep(1) 

try: 
    sleeper() 
except KeyboardInterrupt: 
    print "Ctrl-C" 

Это работает для меня (как я думаю, что вы собираетесь его). (Я знаю, что это скорее комментарий, но я не мог получить код, чтобы правильно отображаться).

Смежные вопросы