Python3エンジニア認定基礎試験 第8章 エラーと例外 予想問題と解説
Python3エンジニア認定基礎試験「第8章 エラーと例外」の予想問題を19問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。出題は公式シラバスの範囲内です。
この章の要点
例外処理の構造、構文エラーと例外、クリーンアップ動作、例外の送出と定義などを扱う分野です。全19問(基礎4問・標準14問・応用1問)を収録しています。
- 例外処理の構造
- 構文エラーと例外
- クリーンアップ動作
- 例外の送出と定義
情報源と編集区分
公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。 一次情報確認日: 2026-09-18。
試験概要(公式)確認しておきたいポイント
当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。
- finally と except と else の役割の混同。finally は例外の有無にかかわらず必ず実行され、except は一致する例外が起きたとき、else は例外が起きなかったときに実行される。
- else 節を置く位置。すべての except 節よりも後ろに置く必要がある。
- 複数の except 節があるとき、最初に一致した節だけが実行されること。
- 構文エラーと例外の取り違え。構文エラーは構文解析の段階で検出される。公式チュートリアルは例外について「たとえ文や式が構文的に正しくても、実行しようとしたときにエラーが発生するかもしれません。実行中に検出されたエラーは例外と呼ばれ、常に致命的とは限りません」と述べている。try 文で受けられるのは後者だけである。
この章の関連用語
この分野の問題で扱う用語です。意味があいまいなものは、用語集で定義を確認できます。
この章に関連する比較記事
混同しやすい2つの概念を並べて整理した記事です。
よくある質問
Q第8章 エラーと例外は何問収録されていますか?
現在19問を収録しています。内訳は基礎4問・標準14問・応用1問です。
Q第8章 エラーと例外の頻出論点は何ですか?
例外処理の構造、構文エラーと例外、クリーンアップ動作、例外の送出と定義などが出題対象です(当サイト収録問題に基づく編集部集計)。
Q間違えた問題はどう復習すればいいですか?
誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。
try 文の finally 節の性質として正しいものはどれか。
答えと解説を見る
正解は「例外が発生したかどうかにかかわらず、必ず実行される」である。finally 節は後片づけのための節で、try の中で例外が起きた場合も起きなかった場合も実行される。例外が発生したときだけ実行されるのは except 節で、finally とは役割が違う。例外が発生しなかったときだけ実行されるのは else 節である。except 節の有無によって finally の実行が変わることもない。try・except・else節のいずれかで例外が発生した場合は、finally節が実行された後にその例外が再送出される。また、try節の中で break・continue・return文に達した場合も、その実行の直前に finally節が実行される。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 第8章 エラーと例外、2026-09-11確認)
構文エラーと例外の違いとして正しいものはどれか。
答えと解説を見る
正解は「構文エラーは解析の時点で検出され、例外は実行中に発生する」である。構文エラーは書き方そのものが文法に合っていない場合に解析の段階で検出されるため、プログラムは実行されない。例外は文法としては正しいプログラムを実行している途中で起きるもので、try 文で捕まえて処理できる。この違いを見分ける手順は、まずエラーがいつ検出されたか、解析の時点か実行中かを確かめ、解析の時点であれば構文エラー、実行中であれば例外だと判断することである。構文エラーは実行前に検出されるため try で捕まえる対象にはならない。どちらも解析の時点で検出されるわけでもなく、例外が警告にとどまるわけでもない。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 第8章 エラーと例外、2026-09-11確認)
try 文に except 節が複数あるとき、実行される節の数はどれか。
答えと解説を見る
正解は「最初に一致した節だけが実行される」である。公式チュートリアルは、except 節は try 節内で例外が発生し、その例外型が except 節で指定された例外に一致する場合に実行されると説明しており、複数の except 節がある場合は最初に一致した節だけが実行されると述べている。そのため節を並べる順序が意味を持ち、広い範囲の例外を受ける節を先に置くと、後ろにある狭い範囲の節へ処理が到達しなくなる。一致したすべての節が実行されるわけではなく、最後に一致した節が選ばれるわけでもない。一致の有無にかかわらず実行されるのは finally 節であり、except 節とは性質が異なる。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 第8章 エラーと例外、2026-09-11確認)
try 文の else 節を置く位置として正しいものはどれか。
答えと解説を見る
正解は「すべての except 節よりも後ろ」である。公式チュートリアルは、else 節は try 節で全く例外が送出されなかったときに実行される節であり、すべての except 節よりも後ろに置く必要があると説明している。except 節より前に置くことはできず、try・except・else という順序が定められている。finally 節はさらにその後ろに置かれる節であり、else 節を finally 節より後ろに置くものでもない。また else 節は try 文を構成する一部であり、try 文の外側に独立して書けるものでもない。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 第8章 エラーと例外、2026-09-11確認)
try 節の中で return に達したとき、finally 節はどうなるか。
答えと解説を見る
正解は「return を実行する直前に finally 節が実行される」である。設問が問うのは、try 節の中で return に達したときに finally 節がいつ、どのように動くかという実行順序である。公式チュートリアルはこの順序を、break・continue・return に達した場合はその直前に finally 節が動くと説明しており、飛ばされることも省略されることもない。値を返し終えたあとに動くのでもなく、finally 節自体を書けなくなる制限も存在しない。後片づけのための節という性質上、return の有無にかかわらず必ず実行される点が判断の軸になる。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 第8章 エラーと例外、2026-09-11確認)
独自にエラーの種類を表したいとき、Pythonの例外のしくみで用いる方法として正しいものはどれか。
答えと解説を見る
正解は「独自の例外クラスを定義し、raise文でそのインスタンスを送出する」である。公式チュートリアルは例外の送出と定義について、raise文を使って例外を送出できること、そしてプログラム側で独自の例外(ユーザー定義例外)を定義できることを説明している。例外は言語が用意した種類しか使えないわけではなく、独自に定義して使うことができる。raise文はprint文の別名ではなく、例外を送出するための構文である。独自のエラーを戻り値の数値だけで表す必要もない。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 第8章 エラーと例外、2026-09-11確認)
raise文の引数に、インスタンスではなく例外クラスそのもの(例: raise ValueError)を渡したときの動作として正しいものはどれか。
答えと解説を見る
正解は「引数無しのコンストラクタが呼び出され、暗黙的にインスタンス化されて送出される」である。公式チュートリアルによると、raiseの唯一の引数は送出される例外で、例外インスタンスか例外クラス(BaseExceptionを継承したクラス)でなければならない。例外クラスが渡された場合は引数無しのコンストラクタが呼び出され、暗黙的にインスタンス化される。raise ValueError は raise ValueError() の省略記法として紹介されている。直前の例外を再送出するのは、except節の中で引数を付けずに書く単純な形式のraise文である。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.4 例外を送出する、2026-09-27確認)
except節の中で別の例外を送出するとき、raise文に付ける from 句の説明として正しいものはどれか。
答えと解説を見る
正解は「raise RuntimeError from exc は、新しい例外が例外excから直接影響されていることを示し、from None は自動的な例外の連鎖を無効にする」である。公式チュートリアルの「例外の連鎖」の節によると、except節の中で未処理の例外が発生した場合、その例外は処理された例外のエラーメッセージに含まれる。ある例外が他の例外から直接影響されていることを示すにはraise文にオプションのfrom句を指定し、例外を変換するときに便利だとされている。自動的な例外の連鎖を無効にするには from None を指定する。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.5 例外の連鎖、2026-09-27確認)
ファイルを with open("myfile.txt") as f: の形で開いて各行を処理したとき、公式チュートリアルが説明する動作として正しいものはどれか。
答えと解説を見る
正解は「文の実行後は、たとえ行の処理中に問題があってもファイルfは常にcloseされる」である。公式チュートリアルの「定義済みクリーンアップ処理」の節では、for line in open("myfile.txt") のように書くと、コードの実行が終わった後に不定の時間ファイルを開いたままになる問題を挙げている。with文はファイルのようなオブジェクトが常に、即座に正しくクリーンアップされることを保証し、with文の実行後は行の処理中に問題があってもファイルfは常にcloseされる。with文は例外の発生そのものを防ぐものではない。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.8 定義済みクリーンアップ処理、2026-09-27確認)
try節で発生した例外が、どのexcept節にも一致せず処理されなかった。finally節があり、その中にはbreak・continue・return文を含まないとき、その後の流れとして正しいものはどれか。
答えと解説を見る
正解は「finally節が実行された後に、その例外が再送出される」である。公式チュートリアルの「クリーンアップ動作を定義する」の節によると、finally節はクリーンアップ動作を定義するためのもので、どんな状況でも必ず実行される。try文の実行中に発生した例外がexcept節で処理されなければ、finally節が実行された後にその例外が再送出される。公式の例でも、文字列同士の割り算で発生したTypeErrorはexcept節で処理されず、finally節の実行後に再度送出されている。else節はtry節で例外が送出されなかったときに実行される節である。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.7 クリーンアップ動作を定義する、2026-09-27確認)
except節の中で、捕捉した例外を自分では処理せず、そのまま呼び出し側へ通したい。Python公式チュートリアルが紹介する書き方として正しいものはどれか。
答えと解説を見る
正解は「except節の中で、引数を付けずに raise だけを書く」である。公式チュートリアルは、例外が発生したかどうかを判定したいだけで、その例外を処理するつもりがなければ、単純な形式の raise 文を使って例外を再送出させることができると説明している。公式の例では、except NameError: の中で「例外が通り過ぎました!」と表示した後に raise を書くと、元の NameError がトレースバックとともに送出される。raise Exception と書くと別の新しい例外を送出することになり、元の例外をそのまま通す書き方ではない。pass だけでは例外の処理が終わったことになり、呼び出し側へは伝わらない。else節は try 節で例外が送出されなかったときに実行される節であり、例外の再送出には使わない。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.4 例外を送出する 、2026-10-02確認)
次のコードで、open() が OSError を送出したときの説明として、公式チュートリアルの記述に基づき正しいものはどれか。 try: open('database.sqlite') except OSError: raise RuntimeError from None
答えと解説を見る
正解は「RuntimeError が送出され、元の OSError との自動的な例外の連鎖は無効になる」である。公式チュートリアルは、except節の中で未処理の例外が発生すると、その例外は処理された例外のエラーメッセージに含まれる(例外の連鎖)と説明し、自動的な例外の連鎖を無効にするには from None を指定すると述べている。公式の例では、raise RuntimeError from None を実行した結果、トレースバックには RuntimeError だけが表示される。raise 文の from 句は、ある例外が他の例外から直接影響されていることを示すために使う書き方で、from None はその連鎖を付けない指定にあたる。例外が消えて正常終了するわけではなく、新しい RuntimeError は送出される。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.5 例外の連鎖 、2026-10-02確認)
独自の例外クラスを定義するときの説明として、Python公式チュートリアルの記述に基づき正しいものはどれか。
答えと解説を見る
正解は「典型的には Exception クラスから直接または間接的に派生させ、名前は Error で終わるものが多い」である。公式チュートリアル8.6は、新しい例外クラスを作成することで独自の例外を指定でき、例外は典型的に Exception クラスから直接または間接的に派生したものだと説明している。また、ほとんどの例外は標準の例外の名前付けと同様に Error で終わる名前で定義されていると述べている。これは多くの例で見られる慣習の説明であり、必須の規則ではない。さらに公式は、例外クラスでも普通のクラスができることは何でも定義でき、大抵はいくつかの属性だけを提供して、ハンドラがエラーに関する情報を取り出せるようにする程度にとどめると説明している。したがって属性を持てないという記述は誤りである。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.6 ユーザー定義例外 、2026-10-02確認)
次の関数を divide("2", "1") で呼び出したときの結果として、公式チュートリアルの記述に基づき正しいものはどれか。 def divide(x, y): try: result = x / y except ZeroDivisionError: print("division by zero!") else: print("result is", result) finally: print("executing finally clause")
答えと解説を見る
正解は「executing finally clause と表示された後、TypeError が再び送出される」である。文字列同士の割り算 "2" / "1" は TypeError を発生させる。except節は ZeroDivisionError だけを対象としているので、この TypeError は処理されない。公式チュートリアルは、try文の実行中に発生した例外がexcept節で処理されなければ、finally節が実行された後にその例外が再送出されると説明している。公式の例でも、divide("2", "1") では executing finally clause が表示されてから TypeError のトレースバックが出力され、文字列で割り算をすることで発生した TypeError は except節で処理されていないので、finally節実行後に再度送出されていると述べている。finally節は例外の有無に関わらず実行されるため、実行されないという選択肢は誤りである。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.7 クリーンアップ動作を定義する 、2026-10-02確認)
try文に except節・else節・finally節がそろっている。このうち else節の実行中に例外が発生したときの動作として、公式チュートリアルの記述に基づき正しいものはどれか。
答えと解説を見る
正解は「finally節が実行された後に、その例外が再送出される」である。公式チュートリアルは、except節または else節の実行中に例外が発生することがあり得ると述べ、その場合も、finally節が実行された後に例外が再送出されると説明している。finally節は、try文が例外を発生させるか否かに関わらず実行される節であり、例外の発生場所が try節・except節・else節のどれであっても実行される。例外が破棄されて正常終了することはない。また、実行中に発生した例外は構文エラーではなく例外として扱われる。構文エラーは構文解析エラーのことであり、実行前に検出される種類のエラーである。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.7 クリーンアップ動作を定義する 、2026-10-02確認)
ネットワーク接続を使う処理で、処理が成功したか失敗したかにかかわらず、最後に必ず接続を閉じたい。公式チュートリアルが finally節について説明している使いどころとして正しいものはどれか。
答えと解説を見る
正解は「ファイルやネットワーク接続などの外部リソースを、利用が成功したかどうかにかかわらず解放する」である。公式チュートリアル8.7は、実世界のアプリケーションでは、finally節は(ファイルやネットワーク接続などの)外部リソースを、利用が成功したかどうかにかかわらず解放するために便利だと説明している。finally節は、try文が例外を発生させるか否かに関わらず実行される。例外が発生したときだけ実行したい処理は except節の役割で、例外が全く送出されなかったときだけ実行したい処理は else節の役割である。扱う例外の型を絞り込むのは except節に指定する例外の型であり、finally節ではない。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 8.7 クリーンアップ動作を定義する 、2026-10-02確認)
次のコードを実行したとき、画面に表示される内容として、公式チュートリアルの記述に基づき正しいものはどれか。 try: try: int('abc') except TypeError: print('inner') except ValueError: print('outer')
答えと解説を見る
正解は「outer と表示される」である。int('abc') は ValueError を送出する。内側の except 節は TypeError を指定しているので一致せず、公式チュートリアルが述べるとおり、一致しない例外は try 文の外側に渡される。外側の try 文には ValueError を指定した except 節があるため、そこで処理されて outer が表示される。例外に対するハンドラがどこにもなければ、処理されない例外としてエラーメッセージを出して実行を停止する。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 第8章 エラーと例外 8.3 例外を処理する、2026-10-26確認)
辞書 d からキー k の値を取り出すとき、キーが存在すると仮定して d[k] をそのまま実行し、KeyError が起きたら except 節で対処する書き方がある。この書き方を表す名前と特徴として、Python公式用語集の説明に合うものはどれか。
答えと解説を見る
正解は「EAFP。有効なキーが存在すると仮定し、仮定が誤りなら例外を捕捉する書き方で、多くの try 文と except 文が特徴である」である。Python公式用語集は、EAFP(Easier to ask for forgiveness than permission)を、有効なキーや属性が存在すると仮定し、仮定が誤りなら例外を捕捉する書き方と説明している。対になる LBYL(Look before you leap)は、呼び出しや検索の前に事前条件を明示的に検査する書き方で、多くの if 文が特徴である。
https://docs.python.org/3/glossary.html (Python公式用語集 EAFP・LBYL の項、事実リスト syllabus-facts.json の第8章で2026-10-12に確認済み。公式チュートリアル 第8章 エラーと例外、2026-10-26確認)
次のコードを実行したとき、画面に表示される内容として、公式チュートリアルの記述に基づき正しいものはどれか。 try: print('A') int('x') print('B') except ValueError: print('C') print('D')
答えと解説を見る
正解は「A、C、D が順に表示される」である。公式チュートリアルによると、try 節の実行中に例外が起きると、残りの try 節は飛ばされる。そのため int('x') で ValueError が送出された時点で print('B') は実行されない。例外の型が except 節の指定と一致すれば、その except 節が実行され、そのあと try 文の後ろへ実行が進む。したがって C の後に D が表示される。この順序は、例外が起きた位置より後ろの文は実行されず、except 節の処理後は try 文の後ろから再開する、という流れで確認できる。
https://docs.python.org/ja/3/tutorial/errors.html (Python公式チュートリアル 第8章 エラーと例外 8.3 例外を処理する、2026-10-26確認)