1 """
2 Exception hook
3 If some unexpected error occures it can be shown in a nice looking dialog.
4 Especially useful is the traceback view.
5
6 Things to extend: Clicking on the filename should open an editor.
7 Things to consider: Mail exceptions, copy to clipboard or send to bug tracker.
8 """
9 import sys
10 import cgitb
11 import atexit
12
13 from PyQt4.QtCore import pyqtSignature, Qt
14 from PyQt4.QtGui import QDialog, QApplication
15
16 from excepthook_ui import Ui_ExceptHookDialog
17
18
19
20 -def on_error(exc_type, exc_obj, exc_tb):
21 """
22 This is the callback function for sys.excepthook
23 """
24 dlg = ExceptHookDialog(exc_type, exc_obj, exc_tb)
25 dlg.show()
26 dlg.exec_()
27
31 """
32 Call this function to show the current error.
33 It can be used inside an except-block.
34 """
35 dlg = ExceptHookDialog(sys.exc_type, sys.exc_value, sys.exc_traceback, title)
36 dlg.show()
37 dlg.exec_()
38
43
47 "removes the error handler"
48 sys.excepthook = sys.__excepthook__
49
50 atexit.register(uninstall)
54
55
56 - def __init__(self, exc_type, exc_obj, exc_tb, title=None):
57 QDialog.__init__(self)
58 self.ui = Ui_ExceptHookDialog()
59 self.ui.setupUi(self)
60 if title:
61 self.setWindowTitle(self.windowTitle() + ": " + title)
62 self.ui.detailsButton.setCheckable(True)
63 self.setExtension(self.ui.tracebackBrowser)
64 self.setOrientation(Qt.Vertical)
65 msg = "%s: %s" % (exc_type.__name__, exc_obj)
66 self.ui.exceptionLabel.setText(msg)
67 html = cgitb.html((exc_type, exc_obj, exc_tb))
68 self.ui.tracebackBrowser.setText(html)
69 self.resize(self.sizeHint())
70
71
72 @pyqtSignature("")
75
76
77 @pyqtSignature("")
80
81
82
83 if __name__ == "__main__":
84
85 app = QApplication(sys.argv)
86 install()
87 print "Triggering error 1"
88 try:
89 fail = 1 / 0
90 except:
91 show_current_error("Using inside except")
92 print "Triggering error 2"
93 fail2 = 1 / 0
94 print "This will never be reached because excepthook"
95 print "complains about fail2"
96