web-dev-qa-db-ja.com

1つのブロックに複数のtryコード

Tryブロックのコードに問題があります。簡単にするために、これは私のコードです:

try:
    code a
    code b #if b fails, it should ignore, and go to c.
    code c #if c fails, go to d
    code d
except:
    pass

このようなことは可能ですか?

50
arvidurs

これをseparatetryブロックにする必要があります。

try:
    code a
except ExplicitException:
    pass

try:
    code b
except ExplicitException:
    try:
        code c
    except ExplicitException:
        try:
            code d
        except ExplicitException:
            pass

これは、code cが失敗した場合にcode bonlyを実行することを前提としています。

code cに関係なくを実行する必要がある場合は、tryブロックを次々に配置する必要があります。

try:
    code a
except ExplicitException:
    pass

try:
    code b
except ExplicitException:
    pass

try:
    code c
except ExplicitException:
    pass

try:
    code d
except ExplicitException:
    pass

ここでexcept ExplicitExceptionを使用しているのは、neverすべての例外を盲目的に無視することをお勧めするためです。それ以外の場合は、MemoryErrorKeyboardInterrupt、およびSystemExitも無視することになります。それらを処理します。

68
Martijn Pieters

fuckit モジュールを使用できます。
_@fuckitデコレーターを使用して、コードを関数にラップします。

@fuckit
def func():
    code a
    code b #if b fails, it should ignore, and go to c.
    code c #if c fails, go to d
    code d
11
Mostafa Bahri

ステートメントを抽出(リファクタリング)します。そして、andorの魔法を使用して、いつ短絡するかを決定します。

def a():
    try: # a code
    except: pass # or raise
    else: return True

def b():
    try: # b code
    except: pass # or raise
    else: return True

def c():
    try: # c code
    except: pass # or raise
    else: return True

def d():
    try: # d code
    except: pass # or raise
    else: return True

def main():   
    try:
        a() and b() or c() or d()
    except:
        pass
6
Inbar Rose

(多数の)try-except句を連鎖させたくない場合は、コードをループで試し、最初の成功時にブレークすることができます。

関数に配置できるコードの例:

for code in (
    lambda: a / b,
    lambda: a / (b + 1),
    lambda: a / (b + 2),
    ):
    try: print(code())
    except Exception as ev: continue
    break
else:
    print("it failed: %s" % ev)

現在のスコープに直接任意のコード(ステートメント)を使用した例:

for i in 2, 1, 0:
    try:
        if   i == 2: print(a / b)
        Elif i == 1: print(a / (b + 1))
        Elif i == 0: print(a / (b + 2))
        break        
    except Exception as ev:
        if i:
            continue
        print("it failed: %s" % ev)
3
kxr