1

私のプログラムは、エラーが発生したときに電子メールを送信します。このプログラムのクラッシュを処理し、このプログラムでそれについて電子メールを送信する方法はありますか?

4

1 に答える 1

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_())
于 2013-03-23T18:45:05.303 に答える