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
このようなことは可能ですか?
これを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 b
onlyを実行することを前提としています。
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すべての例外を盲目的に無視することをお勧めするためです。それ以外の場合は、MemoryError
、KeyboardInterrupt
、およびSystemExit
も無視することになります。それらを処理します。
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
ステートメントを抽出(リファクタリング)します。そして、and
とor
の魔法を使用して、いつ短絡するかを決定します。
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
(多数の)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)