2013-03-19 100 views

回答

1

您正在尋找sys.excepthook,這裏有一個例子:

#!/usr/bin/env python 
#-*- coding:utf-8 -*- 

import cStringIO, traceback 

from PyQt4 import QtGui, QtCore 

errorNotice = """ 
An unhandled exception occurred. Details will be reported 
via an automatic email. 
""" 

class MyMessageBox(QtGui.QMessageBox): 
    def __init__(self, *args, **kwargs):    
     super(MyMessageBox, self).__init__(*args, **kwargs) 
     self.tracebackInfoStream = cStringIO.StringIO() 

     self.setIcon(QtGui.QMessageBox.Critical) 
     self.finished.connect(self.on_finished) 

    def getTraceback(self, exceptionTraceback): 
     traceback.print_tb(
      exceptionTraceback, 
      None, 
      self.tracebackInfoStream 
     ) 

     self.tracebackInfoStream.seek(0) 

     return self.tracebackInfoStream.read() 

    def exceptHook(self, exceptionType, exceptionValue, exceptionTraceback): 
     tracebackInfo = self.getTraceback(exceptionTraceback) 

     self.setDetailedText(tracebackInfo) 
     self.setText(errorNotice) 
     self.exec_() 

    @QtCore.pyqtSlot() 
    def on_finished(self): 
     QtGui.QApplication.quit() 

class MyWindow(QtGui.QWidget): 
    def __init__(self, parent=None): 
     super(MyWindow, self).__init__(parent) 

     self.pushButtonError = QtGui.QPushButton(self) 
     self.pushButtonError.setText("Raise an Error!") 
     self.pushButtonError.clicked.connect(self.on_pushButtonError_clicked) 

     self.layoutVertical = QtGui.QVBoxLayout(self) 
     self.layoutVertical.addWidget(self.pushButtonError) 

    @QtCore.pyqtSlot() 
    def on_pushButtonError_clicked(self): 
     raise UserWarning("This is an error") 

if __name__ == "__main__": 
    import sys 

    app = QtGui.QApplication(sys.argv) 
    app.setApplicationName('MyWindow') 

    myMessageBox = MyMessageBox() 

    sys.excepthook = myMessageBox.exceptHook 

    main = MyWindow() 
    main.show() 

    sys.exit(app.exec_())