2017-01-08 1 views
-1
try : 
    doSomething1() 
    doSomething2() 
    doSomething3() 
except Exception as e : 
    doSomething4() 
} 

私は上記のコードでdoSomething1()が失敗した場合、doSomething2() & doSomething3()が実行されず、doSomething4()にジャンプすることを知っています。
しかし、私はdoSomething1() or doSomething2() or doSomething2()の上のいずれかが失敗した場合、全体の試行が実行され、実際に私は、私は2つの行を作成しますが、時には第二列が失敗し、最初のデータベースとし、tryに働いているdoSomething4()
にジャンプしますしない何かをしたいですそうではありませんが、第2行が失敗したときに第1行が保存されることは望ましくありません。私は彼らの両方が一緒に実行するか失敗するようにします。どうやって?実行方法try内のすべての文が失敗しない場合は?

+6

データベースで作業している場合、トランザクションとロールバックエラーを使用できません。 – Lucero

+1

はい、トランザクション動作が必要なようです。純粋なPythonエラー処理ではなく、データベースドライバで使用可能なツールを使用してこれを行う必要があります。 – jonrsharpe

+1

Pythonは時間通りに戻ることはできません。何かが完了すると、自動的に元に戻すことはできません。 – Barmar

答えて

0

あなたがdoSomething1doSomething2doSomething3方法のいずれかが失敗した場合、その後、tryブロックはスキップされ、doSomething4メソッドが実行されることを望みます。

これは論理的に可能ではありません。 doSomething1が失敗した場合、実行されたため、try全体を完全にスキップすることはできません。 doSomething2と同じです:失敗した場合は実行されており、doSomething1は失敗していないので、まだdoSomething3しかスキップできません。

ここでは、実装できるいくつかの異なる動作を示します。 doSomething1doSomething2doSomething3を実行しようと

行動1

try: 
    doSomething1() 
    doSomething2() 
    doSomething3() 
except: 
    doSomething4() 
。いずれかが失敗した場合、次のものはスキップされ、 doSomething4が実行されます。それ以外の場合、 doSomething4はスキップされます。 doSomething1doSomething2doSomething3を実行しようと

行動2

try: 
    doSomething1() 
    doSomething2() 
    doSomething3() 
finally: 
    doSomething4() 
。そのうちの1つが失敗すると、次のものはスキップされます。どちらの場合も、最後に doSomething4が実行されます。

行動3

try: 
    doSomething1() 
except: 
    try: 
     doSomething2() 
    except: 
     pass 
    else: 
     try: 
      doSomething3() 
     except: 
      pass 
     else: 
      doSomething4() 
else: 
    try: 
     doSomething2() 
    except: 
     try: 
      doSomething3() 
     except: 
      pass 
     else: 
      doSomething4() 
    else: 
     try: 
      doSomething3() 
     except: 
      doSomething4() 

正確doSomething1の1、doSomething2doSomething3が失敗した場合、doSomething4が実行されます。この振る舞いは、より簡単な例外管理ではるかに簡単な方法で実装できますが、このコードはtryexceptおよびelseを使用するメリットがあります。

行動4

これは、あなたの質問のタイトルに対応するものです。 doSomething1,doSomething2およびdoSomething3のいずれも失敗した場合は、doSomething4が実行されます。それ以外の場合は実行されません。

関連する問題