第9章_例外処理
今回の項目では、例外処理ついて出題されます。
本試験の主教材である「Python3エンジニア認定基礎試験問題集」では第9章(P120~P122)の4問の内容です。
練習問題 1
次のコードを実行したときに起こるエラーとして正しいものを選択してください。
numbers = [1, 2, 3]
print(numbers[3])
- IndexError
- KeyError
- ValueError
- TypeError
答えはコチラをクリック!
答え:1
ポイント
リスト numbers = [1, 2, 3]には、インデックス 0, 1, 2 の3つの要素があります。しかし、print(numbers[3]) では インデックス3 の要素を取得しようとしています。
Pythonのリストは 0から始まるインデックス を持つため、numbers[3] は 存在しない要素を参照 することになり、IndexError が発生します。
他の選択肢について:
2. →KeyError: 辞書に対して存在しないキーを参照した場合に発生するエラー(リストには関係なし)。
3. → ValueError: 型変換などで不適切な値が使われたときに発生するエラー(インデックス参照とは関係なし)。
4. → TypeError: 型が適切でない演算や操作が行われたときに発生するエラー(インデックスの問題とは関係なし)。
練習問題 2
次のコードで起こりうる例外を処理するとき、空欄①に当てはまる記述として正しいものを選択してください。
data = {"A": 100, "B": 200, "C": 300}
key = input("値を取得するキー:")
try:
value = int(data[key]) + 10
print(f"新しい値: {value}")
except ① :
print("エラーが発生しました")
- (TypeError, NameError)
- (KeyError, TypeError)
- (ValueError, IndexError)
- (KeyError, ValueError)
答えはコチラをクリック!
答え:4
ポイント
KeyError: key に辞書 data に存在しないキーを入力した場合、data[key] の部分で KeyError が発生する。
ValueError: int(data[key]) の変換時に、もし data[key] の値が整数に変換できない場合(例えば、辞書の値が数値でなく文字列だった場合)に ValueError が発生する可能性がある。
他の選択肢について:
1. (TypeError, NameError) → NameError は変数が未定義のときに発生するが、このコードには該当する部分がない。
2. (KeyError, TypeError) → TypeErro は発生しない(辞書のキー参照や整数の加算は正しい操作)。
3. (ValueError, IndexError) → IndexError はリストの範囲外アクセス時に発生するため、辞書操作には関係ない。
練習問題 3
次のコードで ZeroDivisionError を発生させるために、空欄①に当てはまる記述として正しいものを選択してください。
try:
① ZeroDivisionError("ゼロ除算エラーです")
except ZeroDivisionError as error:
print(error)
- trigger
- raise
- throw_error
- exception
答えはコチラをクリック!
答え:2
ポイント
Python で例外を発生させるには raise を使用します。
他の選択肢について:
1. trigger → 不正解。Python には trigger というキーワードは存在しません。
3. throw_error →不正解。throw は JavaScript などの言語で使われる例外発生のキーワードですが、Python では無効です。
4. exception→ 不正解。exceptionは「例外」を意味する単語ですが、Python では例外を発生させるキーワードではありません。Exception クラスは存在しますが、直接 exception と記述するとエラーになります。
練習問題 4
次のコードで ZeroDivisionError を発生させるために、空欄①に当てはまる記述として正しいものを選択してください。
try:
① ZeroDivisionError("ゼロ除算エラーです")
except ZeroDivisionError as error:
print(error)
- trigger
- raise
- throw_error
- exception
答えはコチラをクリック!
答え:2
ポイント
Python で例外を発生させるには raise を使用します。
他の選択肢について:
1. trigger → 不正解。Python には trigger というキーワードは存在しません。
3. throw_error →不正解。throw は JavaScript などの言語で使われる例外発生のキーワードですが、Python では無効です。
4. exception→ 不正解。exceptionは「例外」を意味する単語ですが、Python では例外を発生させるキーワードではありません。Exception クラスは存在しますが、直接 exception と記述するとエラーになります。
確認問題 1
次のコードを実行した時起こるエラーとして正しいものを選択して下さい。
num = "2,000'
print(int(num))
1. TypeError
2. ValueError
3. SyntaxError
4. NameError
答えはコチラをクリック!
答え:3
num = “2,000′ の行で文字列を定義していますが、引用符が一致していません。開始はダブルクォート(“)で、終了はシングルクォート(‘)になっています。Pythonでは文字列の開始と終了に同じ種類の引用符を使用する必要があります。
このようなコードはパースの段階でエラーとなるため、コードを実行しようとした時点で SyntaxError が発生し、プログラムは実行されません。
正しい記述は num = “2,000” または num = ‘2,000’ のいずれかになります。
確認問題 2
次のコードで起こりうる例外を処理するとき、空欄➀に当てはまるものとして正しいものを選択してください。
stocks = {"pencil": 200, "notebook": 300, "pencase": 500}
key = input("値引きしたい文房具:")
off_percent = input("値引き率(%):")
try:
rate = (100 - int(off_percent)) / 100
new_price = int(stocks[key] * rate)
stocks[key] = new_price
except ➀
print("エラーが発生しました")
1. (KeyError, NameError)
2. (ValueError, KeyError)
3. (ValueError, NameError)
4. (TypeError, NameError)
答えはコチラをクリック!
答え:2
このコードで発生しうる例外は2種類あります:
- ValueError: int(off_percent) の部分で、ユーザーが数値に変換できない文字列(例えば「abc」など)を入力した場合に発生します。
- KeyError: stocks[key] の部分で、ユーザーが辞書 stocks に存在しないキー(”pencil”、”notebook”、”pencase” 以外)を入力した場合に発生します。
したがって、これらの例外を適切に処理するためには、except の後に (ValueError, KeyError) と記述する必要があります。
選択肢1、3、4に含まれる NameError はこのコードでは発生しません。すべての変数は適切に定義されているためです。
確認問題 3
次のコードで意図的にValueErrorを発生させるために、空欄➀に当てはまるものを選択してください。
【ディレクトリ構成】
try:
➀ ValueError("ValueErrorです。")
except ValueError as e:
print(e)
1. return
2. send
3. raise
4. throw
答えはコチラをクリック!
答え:3
このコードは例外処理の基本的な使い方を示しています。
- try ブロック内で raise ValueError(“ValueErrorです。”) という命令により、意図的に ValueError 例外を発生させています。
- except ValueError as e の部分で、発生した ValueError 例外を捕捉し、例外オブジェクトを変数 e に格納しています。
- print(e) で、例外オブジェクトのメッセージ(”ValueErrorです。”)を画面に表示しています。
実行すると「ValueErrorです。」と出力されます。このパターンは、エラーが発生しても処理を続行させたい場合や、エラーメッセージをユーザーに分かりやすく伝えたい場合に使用されます。
確認問題 4
次のコードを実行した結果として正しいものを選択してください。
def divide(number, divider):
try:
answer = number / divider
return answer
except ZeroDivisionError:
print("0で割ることはできません")
except TypeError:
print("引数の型が異なります")
finally:
print("__finaly節の処理__")
answer = divide(100,"0")
print(f"結果: {answer}")
1.
引数の型が異なります
__finaly節の処理__
結果: None
2.
0で割ることはできません
__finaly節の処理__
結果: None
3.
引数の型が異なります
結果: None
4.
0で割ることはできません
結果: None
答えはコチラをクリック!
答え:1
- divide 関数は2つの引数(numberとdivider)を受け取り、割り算を行います。
- 関数内の処理:
- try ブロックで number / divider の除算を試みます
- ZeroDivisionError が発生した場合(0で割った場合)、エラーメッセージを表示します
- TypeError が発生した場合(引数の型が不適切な場合)、エラーメッセージを表示します
- finally ブロックは例外の発生有無にかかわらず常に実行され、メッセージを表示します
- メイン処理:
- divide(100,”0″) を呼び出しています
- この場合、数値と文字列で演算しようとするため TypeError が発生します
- 結果を answer に格納し、表示しようとします
実行結果:
引数の型が異なります
__finaly節の処理__
結果: None
TypeError が捕捉されてエラーメッセージが表示され、finally ブロックも実行されますが、例外処理では戻り値が指定されていないため、answer には None が格納されます。
次回は…
次回は「019_Pythonエンジニア認定基礎試験10-1~3」です。
モジュールについて学びましょう!
参考資料一覧:Python3エンジニア認定[基礎試験]問題集
https://www.pythonic-exam.com
https://data-engineer-japan.com
https://mynavi-agent.jp
https://python-basic.com
https://www.tokai-bs.co.jp
https://freelance.techcareer.jp/articles/wp/skills/python/detail/550/
https://pythonzen-pep8-exam.jp/