2016-01-21 98 views
1

我想从我的PyQt应用程序记录所有错误。即使那些沉默 - 提出,但程序继续运行。
所以,我有:捕获PyQt例外

记录功能

def setLogger(level=logging.DEBUG, 
       name="my_logger", 
       file=join("src", "log.out")): 
    logger = logging.getLogger(name) 
    logger.setLevel(level) 

    ch = logging.StreamHandler() 
    ch.setLevel(logging.INFO) 
    formatter = logging.Formatter('%(message)s') 
    ch.setFormatter(formatter) 

    fh = logging.FileHandler(file) 
    fh.setLevel(level) 
    formatter = logging.Formatter(
     '%(asctime)s : %(message)s', 
     datefmt='%m/%d/%Y %I:%M:%S %p') 
    fh.setFormatter(formatter) 

    logger.addHandler(ch) 
    logger.addHandler(fh) 
    return logger 

Sys.excepthook的沉默异常

sys._excepthook = sys.excepthook 
    def exception_hook(exctype, value, traceback): 
     sys._excepthook(exctype, value, traceback) 
     sys.exit(1) 
    sys.excepthook = exception_hook 

然后我尝试做这样的事情

def main(): 
    app = QtGui.QApplication(sys.argv) 
    app.setQuitOnLastWindowClosed(False) 
    logger.info("New session started") 
    try: 
     window = MainWindow() 
     window.show() 
     sys.exit(app.exec_()) 
    except Exception: 
     logger.exception("Got error in MainWindow") 

而somwewhere在主窗口

try: 
    dialog = MyDialog(somedata, somedata) 
    dialog.closed.connect(self.doSomething) 
    dialog.exec_() 
except Exception: 
    self.logger.exception("Got error in Dialog module") 
    sys.exit() 

手动引发异常

class MyDialog(QtGui.QDialog): 
    def __init__(self): 
     super(MyDialog, self).__init__() 
     raise Exception 

一切如预期......几乎。
而不是消息我得到!

我在做什么错误以及如何改变?

回答

0

这个问题与PyQt或异常无关,但与我的愚蠢:)。
每个班里都有自己记录,它被初始化这样

self.logger = setLogger() 

的问题是,我没有给他们自己的名字,所以我立刻有4个记录仪具有相同的名称= my_logger。在我为所有记录器设置了不同的名称后,问题就消失了。

class MyDialog(QtGui.QDialog): 
    def __init__(): 
    super(MyDialog, self).__init__() 
    self.logger = setLogger("dialog_logger") 
[...] 

class MyWindow(QtGui.QMainWindow): 
    def __init__(): 
    super(MyWindow, self).__init__() 
    self.logger = setLogger("window_logger") 
[...] 
#and so on