2017-06-25 8 views
0

pythonにいくつかの例外処理コードがあります。最初のコードは2番目の例外の "スーパーセット"です。Pythonですぐにエラーを再発生して再キャッチ

I.e.次のコードは、私が何をする必要があるかまとめたもの(と正常に動作します)

try: 
    normal_execution_path() 
except FirstError: 
    handle_first_error() 
    handle_second_error() 
except SecondError: 
    handle_second_error() 

しかし、それはきれいで読みやすいままにするコードのための独立した機能に抽象化のすべてに私を必要とします。 (SecondErrorは、それがこのブロック内で発生した場合、再catched取得していません)

try: 
    normal_execution_path() 
except FirstError: 
    handle_first_error() 
    raise SecondError 
except SecondError: 
    handle_second_error() 

をしかし、これは動作するようには思えません。私のようないくつかの簡単な構文のためにホッピングされました。しかし、その方向に何かできるか?あなたは手動で処理される第2のエラーをスローする場合

+1

追加のハンドラを指定しない限りできません。エラーが 'FirstError'または' SecondError'のインスタンスである場合に分岐する方が良いでしょう。 –

答えて

0

、あなたはこれらのように、ネストされたのtry-catchブロックを使用することができます。

try: 
    normal_execution_path() 
except FirstError: 
    try: 
     handle_first_error() 
     raise SecondError 
    except SecondError: 
     handle_second_error() 
except SecondError: 
     handle_second_error() 
-1

は、おそらくそれは、コードのアーキテクチャを検討する価値があります。しかし、あなたの特定の場合:

このタイプのエラーを処理する汎用クラスを作成します。第1および第2のエラーの場合、それを継承する。このタイプのエラーのハンドラを作成します。ハンドラでは、第1または第2の特殊ケースをチェックし、それを滝で処理します。

class SupersetException(Exception): 
    pass 


class FirstError(SupersetException): 
    pass 


class SecondError(SupersetException): 
    pass 


def normal_execution_path(): 
    raise SecondError 


def handle_superset_ex(state): 
    # Our waterfall 
    # We determine from whom the moment to start processing the exception. 
    if type(state) is FirstError: 
     handle_first_error() 
    # If not the first, the handler above will be skipped 
    handle_second_error() 


try: 
    normal_execution_path() 
except SupersetException as state: 
    handle_superset_ex(state) 

次に、アイデアを開発してください。

関連する問題