except 節の順序
次のコードを実行したときの出力として、正しいものを1つ選べ。
class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
try:
raise cls()
except D:
print("D", end=" ")
except C:
print("C", end=" ")
except B:
print("B", end=" ")
- A
B B B - B
B C D - C
D C B - D
D D D
正解と解説を見る
正解:B
except 節は上から順に調べられ、送出された例外のクラスかその親クラスを指定した最初の節で処理される。
| 順 | 実行する行 | 実行後の変数 |
|---|---|---|
| 1 | `class B(Exception):` | — |
| 2 | └ `pass` | — |
| 3 | `class C(B):` | — |
| 4 | └ `pass` | — |
| 5 | `class D(C):` | — |
| 6 | └ `pass` | — |
| 7 | `for cls in [B, C, D]:` | — |
| 8 | `try:` | — |
| 9 | `raise cls()` | — |
| 10 | `except D:` | — |
| 11 | `except C:` | — |
| 12 | `except B:` | — |
| 13 | `print("B", end=" ")` | — |
| 14 | `for cls in [B, C, D]:` | — |
| 15 | `try:` | — |
| 16 | `raise cls()` | — |
| 17 | `except D:` | — |
| 18 | `except C:` | — |
| 19 | `print("C", end=" ")` | — |
| 20 | `for cls in [B, C, D]:` | — |
| 21 | `try:` | — |
| 22 | `raise cls()` | — |
| 23 | `except D:` | — |
| 24 | `print("D", end=" ")` | — |
| 25 | `for cls in [B, C, D]:` | — |
| 分岐 | `except D:` | 実行される |
| 分岐 | `except C:` | 実行される |
| 分岐 | `except B:` | 実行される |
| 結果 | 実際の出力 | B C D |
- A
誤り。この順番の except 節なら、それぞれの例外に合った節で処理される。except B を最初に書くと、すべて B と出力される。
- B
正しい。except 節は上から順に調べられ、例外のクラスか、その親クラスを指定した最初の節で処理される。
- C
誤り。B の例外は except D や except C には当てはまらない。
- D
誤り。B や C の例外は、子クラスの D を指定した節では処理されない。
このサイトの問題は、各試験の公式に示された出題範囲に沿って作ったオリジナルの模擬問題です。本試験の問題ではありません。一般社団法人Pythonエンジニア育成推進協会の公式サービスではありません。