2017-03-06 99 views
1

我正在面對一些使用pyqt5的代碼的問題。 當我的Qt類出現問題時,控制檯不會記錄關於發生崩潰原因的任何信息。 例如,此代碼:爲什麼PyCharm中的python控制檯在使用pyqt時不顯示任何錯誤消息?

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

由於bTestForCrash功能尚不清楚,Qt的窗口剛剛退出,但我已經沒有什麼在控制檯中。我想知道如果他們是一種強制控制檯自動打印正在發生的線索的方法。

現在我使用的是tryexcept去解決這個問題,但我不喜歡這個主意:

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另一種方式except

正如@three_pineapples所提到的,我在'真正的'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程序中,這個就在程序退出之前發生。 可以通過向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() 
相關問題