はじめに
今回は「例外処理」を取り上げます。
プログラムを作成しているとエラーが発生することがあります。エラーが発生すると通常はプログラムが停止しますが、例外処理を利用することで、エラーが起きてもプログラムを続行させたり、適切な対処をすることが可能になります。
例外処理は、エラーへの対応策を事前に準備する仕組みです。
Pythonにおけるエラーの種類
Pythonプログラムの実行中に発生するエラーは、大きく分けて2つの種類があります。
1. 構文エラー
構文エラーは、コードが文法的に間違っている場合に発生します。このエラーはプログラムの実行前に検出され、修正する必要があります。
構文エラーの例
# 構文エラーの例
# コロンが抜けているためエラーが発生します
# 正しくは if 文の末尾に「:」を付ける必要があります
if True
print("こんにちは")
この例では、if True
の後にコロンがないため構文エラーになります。
2. 例外エラー
例外エラーは、コードが文法的には正しい場合でも、実行時に問題が発生したときに起こるエラーです。例えば、0で割るような操作や、データ型が合わない場合などに発生します。。
例外エラーの例
# 例外の例
# 変数 A に 10 を代入します
A = 10
# 変数 B に 0 を代入します
B = 0
# 割り算を行い、結果を表示しようとしますが、B が 0 なのでエラーが発生します
# このエラーは ZeroDivisionError という例外です
print(A / B)
このコードを実行すると、ZeroDivisionError
(ゼロ除算エラー) という例外エラーが発生し、プログラムが停止します。
構文エラーはプログラムを実行する前に見つけることができますが、例外は実行中に発生します。
例外処理の基本
例外エラーが発生するとプログラムは停止しますが、例外処理を利用するとエラーを適切に処理し、プログラムを続行することができます。例外処理を行うには、Pythonのtry~except文を使用します。
try~except文の基本構文
以下の構文で例外処理を記述します。
try:
# エラーが発生する可能性のあるコード
except:
# 例外エラーが発生した場合の処理
実際の例
以下のコードは、0で割る操作によって発生するZeroDivisionErrorを例外処理で対処しています。
# 例外処理の例
# 変数 A に 10 を代入します
A = 10
# 変数 B に 0 を代入します
B = 0
# 例外処理を使ってエラーを回避します
try:
# エラーが発生する可能性のあるコード
print(A / B) # ここで ZeroDivisionError が発生します
except:
# 例外エラーが発生した場合の処理
print("エラー: 0で割ることはできません")
実行結果
エラー: 0で割ることはできません
try~except文の動作説明
- tryブロック内のコードを実行します。
- エラーが発生した場合、プログラムはtryブロックの残りの処理をスキップし、exceptブロックのコードを実行します。
- エラーが発生しなければ、exceptブロックは実行されません。
例外処理を利用することで、予期しないエラーに対して適切な対応が可能となり、プログラムの停止を防ぐことができます。
Try~Exceptの派生パターン
try~except文には、条件に応じた追加のブロックを加えることで、さらに柔軟な例外処理が可能になります。ここでは、代表的な派生パターンであるtry~except~else文とtry~except~finally文について解説します。
try~except~else文
elseブロックを使うと、try
ブロック内のコードが正常に実行された場合のみ実行される処理を記述できます。
基本構文
try:
# エラーが発生する可能性のあるコード
except:
# 例外エラーが発生した場合の処理
else:
# エラーが発生しなかった場合の処理
実際の例
# 例外処理の派生パターン: try~except~else
# 変数 A に 10 を代入します
A = 10
# 変数 B に 2 を代入します
B = 2
try:
# エラーが発生する可能性のあるコード
result = A / B
print(f"計算結果: {result}")
except:
# 例外エラーが発生した場合の処理
print("エラー: 計算中に問題が発生しました")
else:
# エラーが発生しなかった場合の処理
print("計算が正常に完了しました")
実行結果
計算結果: 5.0
計算が正常に完了しました
この例では、割り算が正常に完了したため、elseブロック内のコードが実行されます。
try~except~finally文
finallyブロックを使うと、エラーの有無に関わらず、最後に必ず実行される処理を記述できます。たとえば、ファイルを開いた後に必ず閉じる処理を行いたい場合に役立ちます。
基本構文
try:
# エラーが発生する可能性のあるコード
except:
# 例外エラーが発生した場合の処理
finally:
# 必ず実行される処理
実際の例
# 例外処理の派生パターン: try~except~finally
# 変数 A に 10 を代入します
A = 10
# 変数 B に 0 を代入します
B = 0
try:
# エラーが発生する可能性のあるコード
print(A / B) # ここで ZeroDivisionError が発生します
except:
# 例外エラーが発生した場合の処理
print("エラー: 0で割ることはできません")
finally:
# 必ず実行される処理
print("プログラム終了処理を実行します")
実行結果
エラー: 0で割ることはできません
プログラム終了処理を実行します
この例では、finallyブロックのコードが必ず実行されることを確認できます。
これらの派生パターンを使うことで、エラー処理をさらに細かく制御することが可能になります。次は、例外エラーの種類ごとの処理を分岐させる方法について解説します。
例外エラーの種類ごとの処理
try~except文では、発生する例外エラーの種類ごとに異なる処理を記述することが可能です。この機能を活用することで、複数の例外エラーに対して適切な対応を分岐させることができます。
エラーの種類を指定しない場合
エラーの種類を指定しない場合、すべての例外エラーが同じ処理でキャッチされます。
実際の例
# エラーの種類を指定しない例外処理
try:
# 数値と文字列の割り算を試みます(エラーが発生します)
result = 10 / "文字列"
except:
# すべての例外エラーをキャッチします
print("エラー: 計算中に問題が発生しました")
実行結果
エラー: 計算中に問題が発生しました
この方法では、エラーの具体的な内容を知ることはできません。
エラーの種類を指定する場合
exceptの後にエラーの種類を指定することで、特定の例外エラーごとに異なる処理を行うことができます。
実際の例
# エラーの種類を指定して処理を分岐
try:
# 数値と文字列の割り算を試みます(エラーが発生します)
result = 10 / "文字列"
except ZeroDivisionError:
# ZeroDivisionError の場合の処理
print("エラー: 0で割ることはできません")
except TypeError:
# TypeError の場合の処理
print("エラー: 型が不正です")
実行結果
エラー: 型が不正です
このコードでは、TypeErrorが発生した場合に対応する処理を実行します。
エラー内容を取得する方法
except文でエラーの種類を指定し、as
キーワードを使用すると、エラーの詳細な内容を取得して表示することができます。
実際の例
# エラーの詳細内容を取得する例
try:
# 0で割り算を試みます(エラーが発生します)
result = 10 / 0
except ZeroDivisionError as e:
# ZeroDivisionError の場合、エラーの詳細内容を取得して表示します
print(f"エラーが発生しました: {e}")
実行結果
エラーが発生しました: division by zero
この方法を使うと、エラー内容を調査する際に役立ちます。
例外エラーを種類ごとに処理することで、プログラムの動作を柔軟に制御することが可能です。次は、実践的な例を使って例外処理の応用を解説します。
まとめ
例外処理は、プログラムの実行中に発生するエラー(例外エラー)に対処するための重要な仕組みです。try~except文を基本に、elseやfinallyを組み合わせることで、柔軟にエラー処理を制御できます。また、エラーの種類ごとに処理を分岐させることで、より具体的で適切な対応が可能になります。例外処理を活用して、エラーに強いプログラムを構築していきましょう。
今回は以上とさせて頂きます。
最後までお読みいただきありがとうございました。