try-except-else-finally【例外処理】3.8 try-except-else-finally【例外処理】3.8メモ 構文 例 メモ例外処理とクリーンアップ処理を記述 例外を記述順に判定し、該当の例外処理のみを実行 (継承等で複数例外に該当しても対象処理は1つ) 複数例外を一括処理:複数の例外を tuple【タプル型】で指定 入れ子可 関連 raise【例外発生】 with【処理のカプセル化】 外部リンク Python 言語リファレンスtry 文実行モデル - 例外Python 標準ライブラリ組み込み例外Python チュートリアルエラーと例外構文 try: 通常処理1 (1行) 通常処理2 (複数行可) except [expression1 (複数指定可) [as identifier1]] : 該当例外時の処理1 (1行) 該当例外時の処理2 (複数行可) ・・・ [except [expressionN (複数指定可) [as identifierN]] : 該当例外時の処理1 (1行) 該当例外時の処理2 (複数行可)] [else: 例外なし時の処理1 (1行) 例外なし時の処理2 (複数行可)] [finally: 最終処理1 (1行) 最終処理2 (複数行可)] ~処理1・~処理2どちらか1つを指定 expression1~N (複数指定可)例外 複数指定:tuple【タプル型】 (両端の丸カッコの省略不可) 省略:全ての例外 (最後の except でのみ可) identifier1~N例外の代入先 (該当の except の最後で自動的に削除) 該当例外時の処理n該当例外が発生した時の処理 (sys.exc_info() でアクセス可) 例外なし時の処理n例外が発生しなかった時の処理 (break・return・continue で抜けたら処理なし) 最終処理n最終的に実行される処理 (break・return・continue で抜けても処理) continue の使用可 3.8 try: 通常処理1 (1行) 通常処理2 (複数行可) finally: 最終処理1 (1行) 最終処理2 (複数行可) 詳細は上の構文参照 例 try: print("TRY") finally: print("FINALLY") # 出力:TRY # 出力:FINALLY try: print("TRY") 1 / 0 finally: print("FINALLY") # 出力:TRY # 出力:FINALLY # 出力:Traceback (most recent call last): # 出力: File "~.py", line ~, in <module> # 出力: 1 / 0 # 出力:ZeroDivisionError: division by zero import sys try: print("TRY") 1 / 0 except: print("EXCEPT") print("SYS.EXC_INFO:", sys.exc_info()) finally: print("FINALLY") # 出力:TRY # 出力:EXCEPT # 出力:SYS.EXC_INFO: (<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x~>) # 出力:FINALLY try: print("TRY") print("例外なし") except: print("EXCEPT") else: print("ELSE") finally: print("FINALLY") # 出力:TRY # 出力:例外なし # 出力:ELSE # 出力:FINALLY try: print("TRY") print("例外あり") 1 / 0 except: print("EXCEPT") else: print("ELSE") finally: print("FINALLY") # 出力:TRY # 出力:例外あり # 出力:EXCEPT # 出力:FINALLY for i in range(10): try: print("TRY") print("例外なし", i) if i == 2: break except: print("EXCEPT") else: print("ELSE") finally: print("FINALLY\n") # 出力:TRY # 出力:例外なし 0 # 出力:ELSE # 出力:FINALLY # 出力:TRY # 出力:例外なし 1 # 出力:ELSE # 出力:FINALLY # 出力:TRY # 出力:例外なし 2 【elseの処理なし】 # 出力:FINALLY class UserError(EOFError, IndexError, SyntaxError): pass lst = [ None, EOFError, ImportError, IndexError, SyntaxError, UserError, ] for err in lst: try: print("TRY", err) if err != None: raise err except EOFError as e: print("EXCEPT (1)", type(e)) except (ImportError, IndexError) as e: print("EXCEPT (2)", type(e)) except: print("EXCEPT (ETC)") else: print("ELSE") finally: print("FINALLY\n") # 出力:TRY None # 出力:ELSE # 出力:FINALLY # 出力:TRY <class 'EOFError'> # 出力:EXCEPT (1) <class 'EOFError'> # 出力:FINALLY # 出力:TRY <class 'ImportError'> # 出力:EXCEPT (2) <class 'ImportError'> # 出力:FINALLY # 出力:TRY <class 'IndexError'> # 出力:EXCEPT (2) <class 'IndexError'> # 出力:FINALLY # 出力:TRY <class 'SyntaxError'> # 出力:EXCEPT (ETC) # 出力:FINALLY # 出力:TRY <class '__main__.UserError'> # 出力:EXCEPT (1) <class '__main__.UserError'> # 出力:FINALLY