2017-03-06 8 views
1

pyqt5を使用している私のコードのいくつかの問題に直面しています。 Qtクラスで問題が発生した場合、コンソールはクラッシュが発生した理由に関する情報を記録しません。このコードのインスタンスの :bとしてpyqtを使用するとPyCharmのpythonコンソールにエラーメッセージが表示されないのはなぜですか?

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

TestForCrash機能では知られていないが、Qtのウィンドウがちょうど終了しますが、私は、コンソールには何も得なかっました。私は、コンソールが自動的に何が起こっているのかの手がかりを印刷するように強制する方法であるかどうか疑問に思っています。

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

tryを使用せず、コンソールでのいくつかの情報をログに記録する彼らの別の方法です:今、私は問題を一周するtryexceptを使用していますが、私は非常にこのアイデアを好きではないために

except

「実際の」Windows端末(c:\ anaconda3 \ python.exe)ではスクリプトを実行しますが、PyCharmコンソールではスクリプトを実行するとエラーが発生します(スクリプトを実行するとエラーが発生します) 。 Pycharmでエラーログを強制的に強制する方法はありますか?多分それは私がまだ見つけられなかったオプションですか?

+1

python.exeまたはpython ** w **。exeを使用してコードを起動していますか?前者は端末に例外を出力する必要があります。 –

+0

私はPyCharmを使用しています。私が選んだインタプリタはc:\ anaconda3 \ python.exeです。 まだ何も印刷されません。 – ymmx

+0

しかし、正しいですが、c:\ anaconda3 \ python.exeを使用してWindows CMDでスクリプトを実行すると、端末にエラーが記録されます。だから問題は多分PyCharmから来るでしょうか? – ymmx

答えて

2

あなたができることは、例外フックsys.excepthookを再定義することです。ドキュメントから引用すると:

例外が発生し、キャッチされないされている場合、インタプリタは三つの引数、例外クラス、例外インスタンス・トレースバックオブジェクトでsys.excepthookを呼び出します。対話セッションでは、これは制御がプロンプトに戻される直前に発生します。 Pythonプログラムでは、これはプログラムが終了する直前に発生します。 このような最上位例外の処理は、別の3つの引数を持つ関数をsys.excepthookに割り当てることでカスタマイズできます。

カスタム関数では、たとえばQMessageboxを表示できます。これは、次の例の関数catch_exceptions()で行われます。また、この関数は古い例外フック(old_hookに格納されている)を呼び出して、メッセージボックスに加えて例外を処理する通常のパスが続くようにします。

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() 
関連する問題