第8章 エラーと例外(40問中4問)
Python3基礎試験の例外処理:try・except・finallyの実行順
第8章のエラーと例外は、try文のどの節がどの順に動くかを読み取る問題が中心です。このページでは、4つの節の実行順、returnとfinallyの関係、except節の並べ方、例外の型の見分け方を、Python 3.9.6で実際に実行した結果で確かめます。覚えるのは、elseは例外が無かったときだけ、finallyは必ず動く、except節は最初に一致した1つだけ、の3つです。
このページは試験の学習用の整理です。公式の問題は転載せず、コードはすべて説明用に作った例です。
公式情報の確認
試験日、料金、申込条件、試験方式など変動する情報は、公式情報を最終確認してください。 当サイトの一次情報確認日: 2026-09-18。
試験の出題範囲・実施要項は変動するため、受験前に公式情報を確認してください。
結論
- 例外が起きないと try → else → finally、起きて except に一致すると try → except → finally の順に動く
- finally は例外の有無に関わらず動き、return の直前にも動く。finally 側の return は try 側の戻り値を上書きする
- except 節が複数あっても実行されるのは最初に一致した1つだけ。広い型(Exception)を先に書くと後ろには届かない
- 0で割ると ZeroDivisionError、型の不一致は TypeError、不正な値は ValueError、未定義の名前は NameError
4つの節が動く順序
try 節の中で例外が起きたかどうかで、except 節と else 節のどちらが動くかが決まります。finally 節は、どちらの場合も最後に動きます。
| 場合 | 動く順序 | ひとこと |
|---|---|---|
| try で例外が起きない | try → else → finally | else は例外が無かったときだけ |
| try で例外が起き、except に一致する | try → except → finally | else は飛ばされる |
公式チュートリアルによると、else 節は try 節で全く例外が送出されなかったときに実行され、すべての except 節よりも後ろに置きます。順序は、例外なしなら try → else → finally、例外ありなら try → except → finally と覚えます。Python 3.9.6で、それぞれの節にログを残して確かめた結果も、この2通りになりました。
returnとfinally
公式チュートリアルによると、try 文が break・continue・return に達すると、その直前に finally 節が実行されます。さらに、finally 節に return 文があると、try 節の return の値ではなく finally 節の return の値が返されます。
| コード | 実行結果 | ひとこと |
|---|---|---|
def r1():
try:
return 'try'
finally:
print('finallyが先に動く')
print(r1()) | finallyが先に動く
try | return の直前に finally が動き、戻り値は try の値のまま |
def r2():
try:
return 'try'
finally:
return 'finally'
print(r2()) | finally | finally の return が try の return の値を上書きする |
def r3():
try:
1 / 0
finally:
return '例外が消える'
print(r3()) | 例外が消える | finally が return すると、起きた例外は再送出されない |
try:
try:
1 / 0
except KeyError:
print('KeyError')
finally:
print('内側finally')
except ZeroDivisionError as e:
print('外側で捕捉', e) | 内側finally
外側で捕捉 division by zero | 一致しない except の例外は、finally の後に外側へ出ていく |
finally の中で return すると、try の戻り値だけでなく、起きていた例外も消えます。公式チュートリアルは、混乱を招くため推奨されないと述べています。except で処理されなかった例外は、finally の実行後に再送出されます。
except節の並べ方と継承
公式チュートリアルによると、except 節のクラスは、そのクラスや派生クラスのインスタンスである例外にマッチします。逆に、派生クラスが書かれた except 節は、その基底クラスのインスタンスにはマッチしません。最初に一致した except 節が駆動され、実行されるハンドラは最大で1つです。
| コード | 実行結果 | ひとこと |
|---|---|---|
try:
1 / 0
except Exception:
print('Exception先')
except ZeroDivisionError:
print('ZeroDivisionError') | Exception先 | 広い型を先に書くと、後ろの狭い型には届かない |
try:
raise KeyError('k')
except (TypeError, KeyError) as e:
print(repr(e)) | KeyError('k') | カッコで囲んで、複数の型を1つの except で受けられる |
ZeroDivisionError は Exception の仲間なので、except Exception を先に書くと、後ろの except ZeroDivisionError は実行されません。Python 3.9.6で調べると、ZeroDivisionError は ArithmeticError の派生、KeyError と IndexError はどちらも LookupError の派生でした。ValueError は LookupError の派生ではありません。
例外の型の見分け方
公式チュートリアルは、例外は様々な型で起こり、その型がエラーメッセージの一部として出力されると説明し、型の例として ZeroDivisionError・NameError・TypeError を挙げています。原因と型の対応は次のとおりです。メッセージはPython 3.9.6での出力です。
| 例外の型 | 起きる原因 | メッセージ・補足 |
|---|---|---|
| ZeroDivisionError | 0で割った(1 / 0) | division by zero |
| TypeError | 型の合わない演算(1 + 'a') | unsupported operand type(s) for +: 'int' and 'str' |
| ValueError | 型は合うが値が不正(int('a')) | invalid literal for int() with base 10: 'a' |
| NameError | 定義されていない名前を使った | name 'undefined_name' is not defined |
| IndexError | リストの範囲外の位置([][1]) | LookupError の派生 |
| KeyError | 辞書に無いキー({}['a']) | LookupError の派生 |
int('a') のように、型は文字列で合っていても中身が数に直せないときは TypeError ではなく ValueError です。1 + 'a' のように、そもそも演算できない型の組み合わせが TypeError です。
Python3エンジニア認定基礎試験の学習に使う書籍(Amazon)
試験範囲を通して読むときの1冊です。読んだ章は、このサイトの章別問題で確かめられます。
よくある質問
第8章のエラーと例外は、何問出ますか?
このサイトが整理した公式の章別出題数では、40問中4問(10.0%)です。出題数の多い4章・5章・3章に次ぐ位置づけで、try文の実行順や、例外の型を読み取る問題が中心になります。
else節は、どんなときに動きますか?
try節で例外が全く送出されなかったときに動きます。公式チュートリアルによると、else節はすべての except節よりも後ろに置きます。例外が起きて except に入ったときは動きません。
finally節は、例外が起きなくても動きますか?
動きます。公式チュートリアルによると、finally節はtry文が例外を発生させるか否かに関わらず実行されます。try節の中で return が実行されるときも、その直前に実行されます。
except節を複数書いたとき、全部実行されますか?
実行されるのは、最初に一致した1つだけです。公式チュートリアルは、実行されるハンドラは最大で1つで、except節の並びが逆なら結果も変わると説明しています。広い型を先に書くと後ろの節に届かないので、狭い型から先に書きます。
