¿Por qué la consola de Python en PyCharm no muestra ningún mensaje de error cuando se usa pyqt?

Tengo algunos problemas con algunos de mis códigos que usan pyqt5. Cuando algo sale mal en mis clases de Qt, la consola no registra ninguna información sobre por qué ocurrieron los lockings. por ejemplo con este código:

rom PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * import sys class SurfViewer(QMainWindow): def __init__(self, parent=None): super(SurfViewer, self).__init__() self.parent = parent self.centralWidget = QWidget() self.color = self.centralWidget.palette().color(QPalette.Background) self.setCentralWidget(self.centralWidget) self.plotview = QGroupBox(" ") self.layout_plotview = QVBoxLayout() self.Button_Crash= QPushButton('Crash!') self.layout_plotview.addWidget(self.Button_Crash) self.centralWidget.setLayout(self.layout_plotview) self.Button_Crash.clicked.connect(self.TestForCrash) def TestForCrash(self,): a=b return def main(): app = QApplication(sys.argv) ex = SurfViewer(app) ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main() 

Como no se conoce b en la función TestForCrash , la ventana de Qt simplemente se cierra, pero no tengo nada en la consola. Me pregunto si es una forma de forzar a la consola a imprimir automáticamente alguna pista de lo que está sucediendo.

Por ahora estoy try except para abordar el problema, pero no me gusta mucho esta idea:

 from PyQt5.QtGui import * from PyQt5.QtCore import * from PyQt5.QtWidgets import * import sys class SurfViewer(QMainWindow): def __init__(self, parent=None): super(SurfViewer, self).__init__() self.parent = parent self.centralWidget = QWidget() self.color = self.centralWidget.palette().color(QPalette.Background) self.setCentralWidget(self.centralWidget) self.plotview = QGroupBox(" ") self.layout_plotview = QVBoxLayout() self.Button_Crash= QPushButton('Crash!') self.layout_plotview.addWidget(self.Button_Crash) self.centralWidget.setLayout(self.layout_plotview) self.Button_Crash.clicked.connect(self.TestForCrash) def TestForCrash(self,): try: a=b except BaseException as e: msg = QMessageBox() msg.setIcon(QMessageBox.Critical) msg.setText(str(e)) msg.setStandardButtons(QMessageBox.Ok) msg.exec_() return def main(): app = QApplication(sys.argv) ex = SurfViewer(app) ex.show() sys.exit(app.exec_()) if __name__ == '__main__': main() 

¿Es su otra forma de registrar alguna información en la consola sin usar un try except ?

Como mencioné en @three_pineapples, recibí errores al ejecutar el script en el terminal de Windows ‘real’ (con c: \ anaconda3 \ python.exe) pero no en la consola de PyCharm (cuando ejecuto el script). Entonces, ¿es una forma de forzar los registros de errores directamente en Pycharm? Tal vez es una opción que no encontré todavía?

Lo que puede hacer es redefinir la excepción hook sys.excepthook . Para citar de la documentación:

Cuando se produce una excepción y no se captura, el intérprete llama a sys.excepthook con tres argumentos, la clase de excepción, la instancia de excepción y un objeto de rastreo. En una sesión interactiva, esto sucede justo antes de que se devuelva el control a la solicitud; en un progtwig de Python esto sucede justo antes de que el progtwig salga. El manejo de tales excepciones de nivel superior se puede personalizar asignando otra función de tres argumentos a sys.excepthook.

Su función personalizada podría mostrar, por ejemplo, un QMessagebox. Esto se hace en la función catch_exceptions() en el siguiente ejemplo. Esa función también llama al antiguo gancho de excepción (almacenado en old_hook ) para que se old_hook la ruta normal de manejo de excepciones además del cuadro de mensaje.

 import sys from PyQt5 import QtWidgets def catch_exceptions(t, val, tb): QtWidgets.QMessageBox.critical(None, "An exception was raised", "Exception type: {}".format(t)) old_hook(t, val, tb) old_hook = sys.excepthook sys.excepthook = catch_exceptions def main(): app = QtWidgets.QApplication(sys.argv) raise RuntimeError if __name__ == "__main__": main()