Python - 例外処理

こんにちは、未来のPythonの魔法使いたち!この素晴らしいPythonの例外処理の旅であなたのガイドとして、とても楽しみです。プログラミングを教えていることが多年にわたる私は、例外を理解することが、トレーニングウィール付きの自転車に乗るようなものだと言えます。最初は難しいかもしれませんが、一旦慣れてしまえば、すぐにスムーズに走行できるようになります!

Python - Exceptions

例外とは?

深いところまで飛び込む前に、基础知识から始めましょう。ケーキを焼くことを想像してみてください(ここで私と一緒にいて、これはPythonに関連していると約束します!)。あなたにはレシピ(コード)と材料(データ)があり、準備が整いました。しかし、中間で卵が切れたらどうなるでしょうか?それは焼き菓子界の例外です!

Pythonでは、例外はプログラムの実行中に発生するエラーです。それは、「ちょっと待て!何かおかしいですよ!」と言う赤い旗が立てられるようなものです。

簡単な例を見てみましょう:

print(10 / 0)

このコードを実行すると、PythonはZeroDivisionErrorを発生させます。それは、「ねえ、0で割ることはできないよ!私のキッチンでは許されないんだ...いや、プログラミング環境では!」と言っています。

Pythonの例外処理

例外が何であるかを知ったので、どのように優雅に処理するかを学びましょう。Pythonでは、tryexceptブロックを使って例外をキャッチし、処理します。

基本的な構造は以下の通りです:

try:
# 例外を発生させる可能性のあるコード
except ExceptionType:
# 例外を処理するコード

前の例を少し変更してみましょう:

try:
result = 10 / 0
print(result)
except ZeroDivisionError:
print("おっと!0で割ることはできないよ。")

このコードを実行すると、クラッシュするのではなく、「おっと!0で割ることはできないよ。」と表示されます。

例外なしのexcept節

時々、発生するすべての例外をキャッチすることが望ましい場合があります。この場合、例外タイプを指定しないexcept節を使用することができます:

try:
# 危険なコード
x = int(input("数を入力してください: "))
y = 10 / x
print(y)
except:
print("何かが間違っています!")

これはtryブロック内で発生するすべての例外をキャッチします。しかし、可能な場合は具体的な例外をキャッチする方が、コードがより正確で、デバッグが容易になります。

複数の例外のexcept節

1つのexcept節で複数の例外を処理することもできます:

try:
x = int(input("数を入力してください: "))
y = 10 / x
print(y)
except (ValueError, ZeroDivisionError):
print("無効な入力または0での除算!")

このコードはValueError(ユーザーが数値以外の値を入力した場合)とZeroDivisionErrorを両方キャッチします。

try-finally節

finally節は、例外が発生するかどうかに関係なく、必ず実行されるコードに使用されます。それは、パーティの後に必ず現れるクリーンアップクルーのようなものです!

try:
f = open("example.txt", "r")
# ファイルに対する操作
except FileNotFoundError:
print("そのファイルは存在しません!")
finally:
f.close()  # これは例外が発生しても常に実行されます

例外の引数

例外は追加の情報を持つことができます。この情報にはexceptブロック内でアクセスすることができます:

try:
x = 10 / 0
except ZeroDivisionError as e:
print(f"エラーが発生しました: {e}")

これは、「エラーが発生しました: 0での除算」と表示されます。

例外の発生

時々、自分自身で例外を発生させることが望ましい場合があります。それは、ゲームの審判としてファウルを呼び出すようなものです:

def check_age(age):
if age < 0:
raise ValueError("年齢は負の値にできません!")
print(f"あなたの年齢は{age}です")

try:
check_age(-5)
except ValueError as e:
print(e)

これは、「年齢は負の値にできません!」と表示されます。

ユーザー定義の例外

自分の例外タイプを作成することもできます。それは、新しいルールをゲームに発明するようなものです:

class TooManyPizzasError(Exception):
pass

def order_pizza(number):
if number > 100:
raise TooManyPizzasError("100以上のピザを注文することはできません!")
print(f"{number}個のピザの注文が成功しました。")

try:
order_pizza(101)
except TooManyPizzasError as e:
print(e)

Pythonのアサーション

アサーションは、特定の条件が満たされていることを確認する方法です。それは、コード内の小さなチェックポイントのようなものです:

def divide(a, b):
assert b != 0, "除数は0にできません!"
return a / b

try:
result = divide(10, 0)
except AssertionError as e:
print(e)

これは、「除数は0にできません!」と表示されます。

標準の例外

Pythonには、ビルトインの例外が一組あります。以下は、最も一般的なものの一部です:

例外名 説明
ZeroDivisionError 0での除算または余りが発生した場合に発生
ValueError 関数が正しい型の引数を取得しても不当な値の場合に発生
TypeError 不適切な型のオブジェクトに操作または関数が適用された場合に発生
NameError ローカルまたはグローバル名が見つからなかった場合に発生
FileNotFoundError ファイルやディレクトリが要求されたが存在しない場合に発生
IndexError シーケンスの添字が範囲外の場合に発生
KeyError 辞書のキーが見つからない場合に発生
ImportError インポート文が失敗した場合に発生

それでは、皆さん!Pythonの例外処理のクラッシュコースを完了しました。例外は敵ではなく、より優れた、より強靭なコードを向かってガイドしてくれるような助けがけのサインポストのようなものだと覚えておいてください。練習を続け、実験を続けることで、プロのように例外を処理することができるようになります。ハッピーコーディング!

Credits: Image by storyset