エラーハンドリング(例外処理)について記述する。
1.エラーハンドリングとは(例外処理)
pythonには様々なエラーが存在し、適切な処理をしない場合、そこで処理が中断される。
そのため予め発生しそうなエラーを予測し、対処法を定めておくことがエラーハンドリングである。(そもそもエラーが発生しないように作れないか考えることが重要)
SyntaxError: # 原因 ⇒ 文法ミス(コロンやカッコの不足等)
if True print("Hello") # コロンが必要
IndentationError: #原因 ⇒ インデントが正しくない場合に発生
def foo():
print("Hello") # インデントが必要
NameError: #原因 ⇒ 存在しない変数や関数を参照しようとすると発生
print(undeclared_variable) # 変数が未定義
TypeError: #原因 ⇒ 不正な型を持つオブジェクトに対して操作を行った場合に発生
print(1 + "2") # 整数と文字列を足すことはできない
ValueError: #原因 ⇒ 正しい型ではあるが、不正な値を使った場合に発生
int("abc") # 不正な文字列を整数に変換しようとした
IndexError: #原因 ⇒ リストやタプルのインデックスが範囲外になっている場合に発生
lst = [1, 2, 3]
print(lst[5]) # 存在しないインデックスにアクセス
KeyError: #原因 ⇒ 辞書に存在しないキーにアクセスしようとした場合に発生
my_dict = {"key": "value"}
print(my_dict["nonexistent_key"]) # 存在しないキーにアクセス
AttributeError: #原因 ⇒ 存在しない属性やメソッドにアクセスしようとすると発生
lst = [1, 2, 3]
lst.append(4)
lst.nonexistent_method() # 存在しないメソッド
ZeroDivisionError: #原因 ⇒ 数値を0で割ろうとすると発生
print(1 / 0) # ゼロで割ることはできない
ImportError: #原因 ⇒ モジュールのインポートに失敗した場合に発生
import non_existent_module # 存在しないモジュールをインポートしようとした
2.try構文によるエラー処理
try構文を用いることで、予め想定しうるエラーが発生した際の処理内容を記述することが可能である。
try :
処理内容
except : 予め発生が想定されるエラー
エラーに対する処理内容
# try構文によるエラーハンドリング
try:
num = int(input("数字を入力してください: ")) # ユーザーが文字を入力した場合、エラーが発生する
print(f"入力した数字は {num} です。")
except ValueError:
print("無効な入力です。数字を入力してください。")
複数のエラー処理をすることも可能である。
# エラー処理を2つ設定してみる
try:
num1 = int(input("1つ目の数字を入力してください: "))
num2 = int(input("2つ目の数字を入力してください: "))
result = num1 / num2
print(f"{num1} ÷ {num2} = {result}")
except ValueError:
print("無効な入力です。数字を入力してください。")
except ZeroDivisionError:
print("ゼロで割ることはできません。")
except ブロック内でエラーの詳細を変数に格納し、エラーメッセージを取得することも可能。
# エラー詳細を出力してみる
try:
num1 = int(input("1つ目の数字を入力してください: "))
num2 = int(input("2つ目の数字を入力してください: "))
result = num1 / num2
print(f"{num1} ÷ {num2} = {result}")
except (ValueError, ZeroDivisionError) as e:
print(f"エラーが発生しました: {e}")
3.elseブロック
エラーが発生しなかった場合にのみ else ブロックが実行される。
# elseブロックを設定してみる
try:
num = int(input("数字を入力してください: "))
except ValueError:
print("無効な入力です。")
else:
print(f"入力した数字は {num} です。")
4.finally ブロック
finally ブロックは、エラーの有無にかかわらず必ず実行される。
ファイル操作やリソース解放に使う。try構文の末尾に記述する。
finally :
処理内容を記述
# finallyによる処理を設定してみる
try:
file = open("data.txt", "r")
content = file.read()
print(content)
except FileNotFoundError:
print("ファイルが見つかりません。")
finally:
if 'file' in locals():
file.close() # ファイルを必ず閉じる
print("ファイルを閉じました。")
5.まとめ
適切なエラーハンドリングを考えた設計とすることも大事であるが、そもそもエラーが発生しないようにできないか?考えることが重要である。