0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

python try構文の話(自分用)

Posted at

エラーハンドリング(例外処理)について記述する。

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.まとめ

適切なエラーハンドリングを考えた設計とすることも大事であるが、そもそもエラーが発生しないようにできないか?考えることが重要である。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?