PySide程序崩溃处理程序

时间:2013-03-19 08:42:55

标签: python python-2.7 error-handling pyqt pyside

我的程序在遇到错误时会发送电子邮件。有没有办法处理此程序的崩溃并发送有关此程序的电子邮件?

1 个答案:

答案 0 :(得分: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_())