Python例外処理をマスター:try、except、finally、raiseの効果的な活用
Python例外処理をマスター:try、except、finally、raiseの効果的な活用
例外はプログラム実行時に発生するエラーです。しかしプログラム実行中、Pythonは自動的に例外を生成し、プログラムのクラッシュを防ぐためにハンドリングする必要があります。Pythonでは、エラー時に例外が自動的に発生するか、コードによって発生・捕捉されます。
例外は、イベントが発生しうるものの、そのタイプのイベントは頻繁には起きないことを示します。メソッドが例外を処理できない場合、呼び出し元の関数に投げられます。最終的にメイン関数の外に例外が投げられると、プログラムは突然終了します。
このPython例外処理チュートリアルで学べること:
- Pythonにおける例外とは?
- 例外の一般的な例
- なぜ例外を使うべきか?
- 例外のルール
- Python例外処理メカニズム
- Python Try文
- Python Except文
- Python Raise文
- 重要なPythonエラー
- その他の重要なPython例外
- エラー vs 例外
例外の一般的な例
- ゼロ除算
- 存在しないファイルへのアクセス
- 互換性のない2つの型の加算
- シーケンスの存在しないインデックスへのアクセス
- 切断されたデータベースサーバーからのテーブル削除
- 利用可能額を超えるATM出金
なぜ例外を使うべきか?
Pythonで例外を使う理由:
- 例外処理でエラー処理コードを通常コードから分離可能
- 例外はエラーを表すPythonオブジェクト
- コードコメントと同様に、プログラムの期待を思い出させる役割
- コードを明確化し可読性を向上
- エラー処理を1箇所・1方法で集中させ、結果を刺激
- エラーメッセージ処理の便利な手段
- Pythonでは
raiseで例外を発生可能 - 例外を発生させると現在のコード実行を中断し、処理されるまで例外を呼び出し元に返す
- 直接処理できないコンポーネントの例外処理
例外のルール
Python例外処理の重要なルール:
- 例外はクラスオブジェクトでなければならない
- クラス例外の場合、特定のクラスを指定したexcept節付きtry文を使用可能
- 文や式が構文的に正しくても、実行時にエラーになることがある
- 実行中に見つかるエラーを例外と呼び、無条件に致命的ではない
Python例外処理メカニズム
例外処理は以下の5つのキーワードで管理:
- try
- except(catchに相当)
- finally
- raise(throwに相当)
Python Try文
try文はキーワードtry、コロン(:)、例外が発生する可能性のあるコードスイートで構成され、1つ以上の節を持ちます。
try文実行中に例外が発生しなければ、インタプリタはそのtry文の例外ハンドラを無視します。
tryスイートで例外が発生した場合、tryスイートは終了し、プログラム制御はtryスイートに続く一致するexceptハンドラに移ります。
構文:
try:
statement(s)
Except文
exceptブロックは一度に1つの引数を取り、捕捉する可能性のある例外の型です。これらの引数は特定の例外型から、すべての例外を捕捉する包括的なカテゴリまで多岐にわたります。
exceptブロックのルール:
exceptキーワードでexceptブロックを定義- Exceptionパラメータは常に括弧で囲む
- 常にexceptブロックが処理する例外の型を表す
- 例外処理コードは2つの{}波括弧の間に記述
- 単一のtryブロック内に複数のexceptブロックを配置可能
- exceptブロックはtryブロックの後にのみ配置可能
- すべてのexceptブロックはサブクラスからスーパークラスの順で並べる
例
try:
# 処理
except ArrayIndexOutOfBoundsException as e:
print("最初に捕捉:", e)
except IOError as e:
print("2番目に捕捉:", e)
Python Finally文
finallyブロックは例外が投げられようが投げられまいが常に実行されます。finallyキーワードでtry-exceptブロックに続くコードブロックを作成できます。
finally節はオプションです。すべての条件下で実行されるべきクリーンアップアクションを定義する目的があります。
try:
raise KeyboardInterrupt
finally:
print('welcome, world!')
# 出力:
# Welcome, world!
# KeyboardInterrupt
finally節はtry文の前に実行されます。
Python Raise文
raise文は例外オブジェクトを初期化する引数を指定します。例外名の後にカンマが続き、引数または引数のタプルが続きます。
構文:
raise [Exception [, args [, traceback]]]
この構文では引数はオプションで、実行時には例外引数の値は常にNoneです。
例
Python例外は文字列、クラス、数値、オブジェクトなど任意の値になりえます。Pythonコアで発生するほとんどの例外はクラスで、引数はそのクラスのインスタンスです。
重要なPythonエラー
| エラータイプ | 説明 |
|---|---|
| ArithmeticError | すべての算術例外の基底クラス。算術演算のエラーで発生。 |
| ImportError | 存在しないモジュールをインポートしようとしたときに発生。モジュール名のタイポや標準パスにモジュールがない場合に起こる。 |
| IndexError | 範囲外のシーケンスを参照しようとしたときに発生。 |
| KeyError | 辞書で特定のキーが見つからないときに発生。 |
| NameError | ローカルまたはグローバル名前空間に存在しない名前がコードで参照されたときに発生。 |
| ValueError | 関数や組み込み操作が、正しい型だが適切でない値の引数を受け取ったときに発生。 |
| EOFError | 組み込み関数(input()やraw_input())がデータを読まずにEOF条件に達したときに発生。 |
| ZeroDivisionError | すべての数値型でゼロ除算またはモジュロ演算が行われたときに発生。 |
| IOError | 入出力操作が失敗したときに発生。 |
| SyntaxError | Python構文にエラーがあるときに発生。 |
| IndentationError | インデントが適切に定義されていないときに発生。 |
その他の重要なPython例外
| 例外 | 説明 |
|---|---|
| ArithmeticError | ゼロ除算などの算術エラー |
| IndexError | 配列インデックスが範囲外 |
| TypeError | 互換性のない型への代入 |
| AttributeError | 属性参照/代入失敗 |
| KeyError | 辞書キーが見つからない |
| ValueError | 不適切な値の引数 |
| RuntimeError | その他の実行時エラー |
エラー vs 例外
| エラー | 例外 |
|---|---|
| Pythonのすべてのエラーは未チェック型 | 例外にはチェック型と未チェック型の両方がある |
| コンパイラ未知の実行時エラー | try-exceptブロックで処理して回復可能 |
| 主にアプリケーション実行環境が原因 | アプリケーション自体が原因 |
| 例: OutOfMemoryError | 例: チェック例外、SQL例外、NullPointerException等 |
まとめ
- 例外はプログラム実行中に発生したエラー
- イベントは起こりうるが、そのタイプは滅多に起きないことを示す
- 例外の一般例: 1) ゼロ除算、2) 存在しないファイルアクセス、3) 互換性のない型の加算
- 例外はエラーを表すPythonオブジェクト
- try文はtryキーワード、コロン、例外が発生しうるコードスイートで構成され、1つ以上の節を持つ
- exceptブロックは一度に1つの引数(捕捉する例外の型)を取る
- raise文は例外オブジェクトを初期化する引数を指定
- finallyブロックは例外の有無に関わらず常に実行される
Python
- C++例外処理をマスター:try、catch、throwの実践例
- Python データ型マスター: 実践ガイド
- Python 演算子完全マスター: 包括的ガイド
- Python pass文完全マスター: 実践ガイド
- Python 関数引数完全マスター: 位置引数・キーワード引数・デフォルト引数
- Python辞書完全ガイド:作成、操作、高度なテクニック
- Python例外処理マスター:try、except、else、finallyを徹底解説
- Pythonイテレータ完全ガイド:仕組みと自作方法
- Pythonクロージャ解説:ネスト関数が変数を捕捉する仕組み
- Java例外ハンドリング完全攻略:try-catch、finally、throw、throws
- Java例外ハンドリング実践:try-catch-finallyとリソース管理