2017-08-03 14 views
3

私は単体テストを実行していますが、例外がスローされていることがわかります。しかし、私はちょうど正確に何が投げられるのか分かりません。Python:投げられる例外を見ることができません

from pt_hil.utilities.PT_HIL_Interface_Utils.widgets import PathPicker 
import unittest 
import wx 

class TestUM(unittest.TestCase): 

    @classmethod 
    def setUpClass(cls): 
     print 'setUpClass called' 
     cls.path_picker = PathPicker() 
     print 'path_picker has been declared' 

    def test_PathPicker(self): 
     self.assertRaises(NotImplementedError, wx.UIActionSimulator.MouseClick(self.path_picker.browse)) 

if __name__ == '__main__': 
    unittest.main() 

PathPickerクラス:

class PathPicker(Widget): 

    def __init__(self, parent=None, name="PathPicker"): 
     print 'hi1' 
     try: 
      Widget.__init__(self, name, parent) 
     except Exception as e: 
      print 'hello' 
      return logging.error(traceback.format_exc()) 
     print 'hi2' 

私はユニットテストを実行したときに私が得る出力は次のようになります。

setUpClass called 
hi1 

Process finished with exit code 1 

ので明確に、何かがで間違って起こっている:Widget.__init__(self, name, parent)が、私はできますそれが何であるかは分かりません。どのような例外やエラーがスローされて印刷するためにこれを得ることができる方法はありますか?

編集:ここではそれと一緒に行くためのWidgetクラスです:

class Widget(QWidget): 
    def __init__(self, name, parent=None): 
     print 'hey2' 
     try: 
      super(Widget, self).__init__() 
     except BaseException as e: 
      print 'hello' 
      return logging.error(traceback.format_exc()) 
     print 'hey3' 

今、それは私を与えている:

setUpClass called 
hi1 
hey2 

Process finished with exit code 1 

答えて

1

私はclass TestUM(unittest.TestCase):

とスクリプトでapp = QApplication(sys.argv)sys.exit(app.exec_())を追加するために必要な:のは、例外フックを追加してみましょう私は必要な例外を投げていた(例外が見えなかったので)問題を解決しません。しかし、それは問題を解決し、スクリプトが実行されます。ありがとう!

2

をあなたがhereを見ることができるように、Pythonでトップの例外(2 .x)は次のとおりです:

したがって、あなたのケースでは、例外をキャッチして、他のいくつかのexceptioがありませんns(まれな例外ですが、おそらくあなたのケースで発生します):SystemExit、KeyboardInterrupt、GeneratorExit。 にあなた除く句を変更してください:

except BaseException as e: 

このように、あなたはすべての例外をキャッチしてください、そして、あなたの問題を検出します。

編集:

でも、PyQTは楽しいことができます。 here mentionnedとして:PyQtはで

はV5.5未処理のPythonの例外が QtのqFatal()関数への呼び出しになります。デフォルトでは、これはabort()を呼び出し、 アプリケーションは終了します。インストールされたアプリケーションでは、 例外フックが優先されます。

したがって、(C++コード、悪いパラメータなどの多くの理由で起こりうる)例外は、アプリケーションを静かに止めることができます。 しかし、最後の部分は便利です。例外フックをインストールした場合、サイレント中断の前に呼び出されます。このこと

from pt_hil.utilities.PT_HIL_Interface_Utils.widgets import PathPicker 
import unittest 
import wx 

class TestUM(unittest.TestCase): 

    @classmethod 
    def setUpClass(cls): 
     print 'setUpClass called' 
     cls.path_picker = PathPicker() 
     print 'path_picker has been declared' 

    def test_PathPicker(self): 
     self.assertRaises(NotImplementedError, wx.UIActionSimulator.MouseClick(self.path_picker.browse)) 

if __name__ == '__main__': 
    app = QApplication(sys.argv) 
    unittest.main() 
    sys.exit(app.exec_()) 

注:これ以上そのスクリプトがどのように見えるはずです

sys._excepthook = sys.excepthook # always save before overriding 

def application_exception_hook(exctype, value, traceback): 
    # Let's try to write the problem 
    print "Exctype : %s, value : %s traceback : %s"%(exctype, value, traceback) 
    # Call the normal Exception hook after (this will probably abort application) 
    sys._excepthook(exctype, value, traceback) 
    sys.exit(1) 

# Do not forget to our exception hook 
sys.excepthook = application_exception_hook 
+0

私はそれを試みました。そして何も変わっていない。奇妙な。また、編集を確認します。 – BUInvent

+1

ああ、QtWidget initで何か不思議なことが起きていて、プログラムの実行を止めることを決めている: '( –

+1

@SlakNation回答は新しい情報で編集されました –

関連する問題