可以创建一个包装PyQt的新信号/插槽装饰器的装饰器,并为所有插槽提供异常处理。也可以重写QApplication :: notify来捕获未捕获的C
++异常。
import sysimport tracebackimport typesfrom functools import wrapsfrom PyQt4 import QtGui, QtCoredef MyPyQtSlot(*args): if len(args) == 0 or isinstance(args[0], types.FunctionType): args = [] @QtCore.pyqtSlot(*args) def slotdecorator(func): @wraps(func) def wrapper(*args, **kwargs): try: func(*args) except: print "Uncaught Exception in slot" traceback.print_exc() return wrapper return slotdecoratorclass Test(QtGui.QPushButton): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setText("hello") self.clicked.connect(self.buttonClicked) @MyPyQtSlot("bool") def buttonClicked(self, checked): print "clicked" raise Exception("wow")class MyApp(QtGui.QApplication): def notify(self, obj, event): isex = False try: return QtGui.QApplication.notify(self, obj, event) except Exception: isex = True print "Unexpected Error" print traceback.format_exception(*sys.exc_info()) return False finally: if isex: self.quit()app = MyApp(sys.argv)t=Test()t.show()try: app.exec_()except: print "exiting"


