在使用Python创建的Qt应用程序中,异常的处理方式很奇怪(此处使用PyQt5创建,但我注意到PySide和PyQt4的行为类似)。请考虑以下脚本。也许这有点太冗长,但是我想创建一个半现实的示例,其中应用程序,主窗口和中央小部件都是分别创建的(可能像现实应用程序中那样是由单独的Python模块创建的)。
from sys import argv, exit
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QLabel, QVBoxLayout, \
QPushButton
def main():
print("running the main Python function")
run_app()
def run_app():
print("intialising the app")
app = QApplication(argv)
ex = MainWindow()
exit(app.exec_())
class MainWindow(QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
print("initialising the main window")
gui = GUIWidget(self)
self.setCentralWidget(gui)
self.show()
class GUIWidget(QWidget):
def __init__(self, parent=None):
super(GUIWidget, self).__init__(parent)
print("initialising the gui")
self.vbox = QVBoxLayout()
self.setLayout(self.vbox)
self.button = QPushButton("Push me to produce an error")
self.button.clicked.connect(self.raise_an_expection)
self.vbox.addWidget(self.button)
# raise Exception # nicely handled exception
def raise_an_expection(self):
raise Exception # poorly handled exception
if __name__ == '__main__':
main()
在未注释GUIWidget.__init__()
的最后一行的情况下,Python会引发异常和Process finished with exit code 1
,如预期的那样。
在评论后,将创建一个带有按钮的应用程序。按预期,按下按钮会引发一个异常,但Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
也会引发异常,我不理解。在我的Mac上,这还会导致出现Python quit unexpectedly
对话框。