2016-10-18 8 views
2

私は以下のように動作するPythonスクリプトを持っています。各機能は完全に異なるタスクを実行し、互いに関連しません。は実行プロセス中に問題を抱えている機能2()場合は私の問題は、その後関数3()機能4()で、機能5()は実行されません。私はあなたが例外(try..except)をキャッチすることでこれを処理すると言うだろうが、私は私が探していないすべての例外をキャッチする必要があります知っている。一言で言えば、関数のどれかが問題を抱えている場合、私の他の関数がどこに影響を与えないかをどのようにコードするのですか?理想的には、問題のある関数を除外し、他の関数を実行させるべきです。例外/エラーの場合のPythonの他の関数の実行を停止しない方法

def function1(): 
    some code 

def function2(): 
    some code 

def function3(): 
    some code 

def function4(): 
    some code 

def function5(): 
    some code 

if __name__ == '__main__': 
    function1() 
    function2() 
    function3() 
    function4() 
    function5() 
+0

つの思考:あなたは右、ちょうど具体的な例外を命名しないことによって、一つ一つの例外をキャッチする必要が 'tを?私はこれがうまくいくはずだ...またはfunction1()の最後にfunction2()を実行するだけで、前にエラーがあった場合には遠くまで移動せずに先にブレークします。 – nostradamus

+0

コードの長さのために例外処理が問題になった場合、 'try wrap_em(func_list) 'のように' try-except'ブロックにすべての関数を "ラップする"関数を書くことができます:func_listのfunc:try:func except: continue' –

+0

@nostradamus - あなたが今述べたことを試してみました。基本的に私の関数にはいくつかのWebクローラーが含まれています。だから私は私の機能が壊れることがいつわからない。だから、関数が問題になるようにそれらを積み重ねると、この場合はうまくいきません。 –

答えて

5

複数を書く必要はありませんtry/except。関数のリストを作成して実行します。たとえば、あなたのコードは次のようにする必要があります:

if __name__ == '__main__': 
    func_list = [function1, function2, function3, function4, function5] 

    for my_func in func_list: 
     try: 
      my_func() 
     except: 
      pass 

OR、デコレータを作成して、あなたの関数のそれぞれにそのデコレータを追加します。チェックA guide to Python's function decoratorsを確認してください。今、あなたの関数の定義と、このデコレータを追加

def wrap_error(func): 
    def func_wrapper(*args, **kwargs): 
     try: 
      return func(*args, **kwargs) 
     except: 
      pass 
    return func_wrapper 

:たとえば、あなたのデコレータは次のようにする必要があり、このデコレータを持つ機能が追加さ

@wrap_error 
def function1(): 
    some code 

任意のException

+0

私はこれが引数である唯一の問題です。そのように実行している関数に引数を渡すことはできません。 –

+1

@ Ev.Kounisできます。その場合は、リストの代わりに 'dict'とする必要があります。 'Key'は関数になり、' value'は引数になります。データ構造は要件に依存しています:) –

0

を上げません。例外を使用して、このような例外をすべてキャッチできます。

if __name__ == '__main__': 
    try: 
     function1() 
    except: 
     pass 
    try: 
     function2() 
    except: 
     pass  
    try: 
     function3() 
    except: 
     pass  
    try: 
     function4() 
    except: 
     pass 

多数の機能のために、あなたは、このようにあなたが機能するために、辞書のキーを反復処理するとPython 3.4のようなパラメータに

+0

私が理解している限り、これはOPが明示的に彼が持ちたくないと言ったものです。 –

+0

私はそれを理解していたので、彼は明示的に出てくる可能性のあるすべての例外を書き留める予定でした。しかし、むしろ彼はすべての例外をキャッチすることができます –

+0

私の機能には約15個のWebクローラーが含まれているため、この方法でのコーディングはpythonicではありません。 –

0

を繰り返す、contextlib.suppressとして新しいコンテキストマネージャがある可能

func_dict = { 
func1 : { 
    param1 : val 
    param2 : val 
    }, 
func1 : { 
    param1 : val 
    param2 : val 
    } 
} 

を使用することができます追加したドキュメントごとのように:

戻り、彼らはwith文の本体で発生し、その後のWi終了後の最初の文で実行を再開した場合に指定された例外のいずれかを抑制し、コンテキストマネージャthステートメント。すべての例外を抑制するために

、あなたはとしてそれを使用することがあります。

from contextlib import suppress 

if __name__ == '__main__': 
    with suppress(Exception): # `Exception` to suppress all the exceptions 
     function1() 
     function2() 
     # Anything else you want to suppress 
関連する問題