3.1 例外のキャッチ
例外について話すのは、ただ観察するためだけではないんだよね。例外っていうのは、Pythonのプログラムが扱える特別なオブジェクトなんだ。例外処理は、プログラムの信頼性と安定性を向上させるための重要なプログラミングの側面だね。
Pythonでは、try
, except
, else
, finally
という構造を使って例外のキャッチと処理ができるんだ。これらの構造を利用して、プログラムの実行中に発生するエラーをキャッチして、適切なアクションを取ることができるよ。
構造 try-except
try-except
構造は、例外のキャッチと処理に使われるんだ。try
ブロックには例外が発生する可能性のあるコードが含まれていて、except
ブロックには例外が発生したときに実行されるコードがあるんだ。
例:
try:
result = 10 / 0
except ZeroDivisionError:
print("エラー: ゼロで除算しています。")
try
ブロック内のコードでZeroDivisionError
が発生した場合、except
ブロックがその例外をキャッチしてprint()
のコードを実行するんだ。
複数の例外の処理
複数のタイプの例外を処理したい場合は、別々のexcept
ブロックを指定することができるよ。
try:
result = int("abc")
except ZeroDivisionError:
print("エラー: ゼロで除算しています。")
except ValueError:
print("エラー: 無効な値です。")
すべての例外のキャッチ
すべての例外をキャッチしたい場合は、特定の例外タイプを指定せずにexcept
ブロックを使用することができるよ。でも、これはデバッグを難しくして重要なエラーを隠す可能性があるから、あんまりおすすめしないな。
try:
result = 10 / 0
except:
print("エラーが発生しました。")
3.2 else
と finally
演算子
try
とexcept
だけでなく、else
とfinally
っていうオプションもあるんだ。これらについてちょっと詳しく話すね。
構造 try-except-else
else
ブロックは、try
ブロックで例外が発生しなかった場合にコードを実行するために使われるんだ。
try:
result = 10 / 2
except ZeroDivisionError:
print("エラー: ゼロで除算しています。")
else:
print(f"結果: {result}")
構造 try-except-finally
finally
ブロックには、例外が発生したかどうかに関係なく実行されるコードが含まれているんだ。これは、リソースの解放や終了操作を実行するのに便利なんだよね。
try:
result = 10 / 0
except ZeroDivisionError:
print("エラー: ゼロで除算しています。")
finally:
print("このブロックは常に実行されます。")
完全な例: try-except-else-finally
例:
try:
result = 10 / 2
except ZeroDivisionError:
print("エラー: ゼロで除算しています。")
else:
print(f"結果: {result}")
finally:
print("このブロックは常に実行されます。")
3.3 try-except-else-finally
の例
それじゃあ、何か大きな実例を見てみよう。例えば、ディスクからファイルを読もうとしているとする — これって簡単そうだよね?
file = open("file.txt", "r")
content = file.read()
print(content)
何がうまくいかないかもしれない?例えば、以下のことが考えられるね:
- ファイルが存在しないかも。誤って削除されたり、保存されていなかったり、別のコンピュータでプログラムが実行されていて、そのコンピュータにはファイルが最初から存在しない場合もあるね。
- ファイルの読み込みエラー。プログラムにファイルへのアクセス権がないかもしれないから、管理者権限が必要なディレクトリにファイルがあるんだろうね。
- 別のプログラムが今ファイルに書き込みをしていて、そのファイルを読むことができない — そのプログラムがファイルに単独アクセス権を持っているんだよね。
まだ足りない?じゃあ、ファイル操作中のどの段階でエラーが発生しても、ファイルを「閉じる」ことを忘れちゃだめだよ。そうしないと、OSがこのファイルの操作に割り当てたリソースを解放できないよ。
だから、実際のコードはだいたいこんな感じになるんだ:
try:
file = open("non_existent_file.txt", "r")
content = file.read()
except FileNotFoundError:
print("エラー: ファイルが見つかりません。")
except IOError:
print("エラー: 入出力エラーです。")
else:
print(content)
finally:
if 'file' in locals() and not file.closed:
file.close()
print("ファイルが閉じられました。")
ようこそ現実の世界へ。ここでは、「動作シナリオ」だけでなく、うまくいかない可能性があるすべてのシナリオについてもコードを書く必要があるんだ。
まあ、怖がらないで。実際は思ったより簡単だから。境界条件(corner cases
)っていうのを理解して、標準的なエラーのチェックを適時に追加するだけでいいんだよ。あとは、現代のフレームワークが君の手助けをしてくれるからね。
GO TO FULL VERSION