2017-03-06 1 views
1

Ich habe ein Problem mit einigen meiner Code, die pyqt5 verwenden. Wenn in meinen Qt-Klassen etwas schief läuft, protokolliert die Konsole keine Informationen darüber, warum die Abstürze passiert sind. zum Beispiel mit diesem Code:Warum Python-Konsole in PyCharm zeigt keine Fehlermeldung, wenn Pyqt verwendet wird?

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() 

Als b nicht in TestForCrash Funktion bekannt ist, beendet das Qt Fenster nur, aber ich habe nichts in der Konsole bekommt. Ich frage mich, ob es eine Möglichkeit ist, die Konsole zu zwingen, automatisch einen Hinweis darauf zu drucken, was vor sich geht.

Denn jetzt bin ich mit ein tryexcept, um das Problem zu gehen, aber ich diese Idee nicht viel mag:

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() 

Ist ihr eine andere Art und Weise einige Informationen in der Konsole anzumelden, ohne einen try mit except?

Wie erwähnt von @ three_pineapples, habe ich Fehler, wenn ich das Skript in 'echten' Windows-Terminal ausführen (mit c: \ anaconda3 \ python.exe), aber nicht in der PyCharm-Konsole (wenn ich das Skript ausführen) . So ist es eine Möglichkeit, Fehlerprotokolle in Pycharm direkt zu erzwingen? Vielleicht ist es eine Option, die ich noch nicht gefunden habe?

+1

Verwenden Sie Python.exe oder Python ** w **. Exe, um den Code zu starten? Ersteres sollte Ausnahmen zum Terminal drucken. –

+0

Ich verwende PyCharm und der Interpreter, den ich gewählt habe, ist c: \ anaconda3 \ python.exe. noch nichts gedruckt. – ymmx

+0

Sie haben jedoch Recht, wenn ich das Skript mit einem Windows-CMD mit c: \ anaconda3 \ python.exe ausführen, habe ich Fehler im Terminal anmelden. Das Problem kommt vielleicht von PyCharm? – ymmx

Antwort

2

Was Sie tun können, ist die Ausnahme Hook sys.excepthook neu zu definieren. Um von der Dokumentation zu zitieren:

Wenn eine Ausnahme ausgelöst und nicht abgefangen wird, ruft der Interpreter sys.excepthook mit drei Argumenten auf, der Ausnahmeklasse, der Ausnahmeinstanz und einem Traceback-Objekt. In einer interaktiven Sitzung geschieht dies unmittelbar bevor die Steuerung an die Eingabeaufforderung zurückgegeben wird. In einem Python-Programm geschieht dies kurz bevor das Programm beendet wird. Die Behandlung solcher Ausnahmen auf oberster Ebene kann angepasst werden, indem sys.excepthook eine weitere Funktion mit drei Argumenten zugewiesen wird.

Ihre benutzerdefinierte Funktion könnte z. B. eine QMessagebox anzeigen. Dies geschieht in der Funktion catch_exceptions() im folgenden Beispiel. Diese Funktion ruft auch den alten Ausnahme-Hook (gespeichert in old_hook) auf, so dass der normale Pfad zum Behandeln von Exceptions zusätzlich zu dem Meldungsfeld befolgt wird.

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() 
Verwandte Themen