2016-10-21 9 views
0

問題:私は通常のPyQtによって抑制ます未処理の例外を処理するために最善の方法を把握しようとしている優雅に抑えハンドル(未処理の)例外

。今

私のソリューションは、以下のデコレータ

def handleExceptions(func): 
    """ 
    Decorator: create and show message box for every unhandled exception that 
    reaches the decorator 
    """ 
    @functools.wraps(func) 
    def decorator(self): 
     try: 
      func(self) 
     except Exception as error: 

      # ... 

      if errBox.exec_() == QMessageBox.Ok: 
       try: 
        self.closeApp() 
       except AttributeError: 
        exit() 

    return decorator 

飾ら方法のいずれもがselfよりも多くのパラメータを必要としない場合は、このソリューションは唯一の作品で、適切な方法を飾ることです。私は、これは(selfを含む)は、1つのまたは複数のパラメータを持つ関数を呼び出すことができます。この

よう
... 
def decorator(self, *args) 
    try: 
     func(self, *args) 
... 

をデコレータを拡張しようとしました。残念ながら、このコードは、メッセージTypeError: method() takes 1 positional argument but 2 were givenで失敗するself以外のパラメータを必要としないメソッドへのアクセスを中断します。

デバッガを使用した後、*argsの2番目のパラメータがbool(False)のように見えることがわかりました。

質問:

  1. は、なぜ、この追加のパラメータが渡されるのでしょうか?
  2. さまざまなパラメータ長の関数で使用できるようにデコレータを変更するにはどうすればよいですか?
  3. これは例外を処理するための良い方法ですか?誰かが私にPyQtで未処理の例外を処理する通常の方法を教えてもらえれば幸いです。

私はthis oneのような他のソリューションを見上げた(私は完全にunderstantない)と(それは私のような例外をスローするか、完全に装飾されたメソッドを壊すのいずれか)、成功せずにそれらを実装しようとしました。

ありがとうございます!

+0

デコレータは恐ろしくovercomplicated、維持するのは難しいようです。リンクした質問の[その他の回答](http://www.riverbankcomputing.com/news)は、[excepthook](http://docs.python.org/3/library/sys.html#sys .excepthook)。私は誰が他の何かを使うことを考えている理由は分かりません。 – ekhumoro

答えて

1

私はexcepthookはおそらく移動するための方法であるとのコメントに同意するが、ここで私はかつて同じような何かである:

@handle_exception_decorator 

または

def handle_exception_decorator(exceptions_to_catch = (ValueError, IndexError, TypeError), return_on_fail=False): 
    def wrap(fn): 
     @functools.wraps(fn) 
     def f(*args, **kwargs): 
      try: 
       return fn(*args, **kwargs) 
      except tuple(exceptions_to_catch) as e: 
       # handle the exception here: 
       return return_on_fail 
     return f 
    return wrap 

はとのあなたの方法を飾ります

@handle_exception_decorator(exceptions_to_catch=(AnExceptionType,)) 

または

@handle_exception_decorator(exceptions_to_catch=(Exception,), return_on_fail=7)  

等...

EDIT:ああ、実際に私はあなたが装飾されている方法は、信号に接続されたスロットで、あなたのスロットは、信号が発する引数のいずれかを無視しているので、あなたの問題があると思います。これを修正する唯一の方法は、装飾された関数を更新して、信号によって送出されるパラメータを取るオプションのキーワード引数を受け入れることです。あなたはもちろん、あなたのメソッドでそれを使う必要はありません。シグナルが出力するものにマッチするメソッドシグネチャが必要です(Qtはこれを正常に処理しますが、)