前の記事:Pythonチュートリアル(7章)の内容を箇条書きでまとめた(作成中)
#はじめに
Python3 エンジニア認定基礎試験対策として、Pythonチュートリアル(書籍)の内容を暗記しやすい箇条書きにまとめた自分用メモです。
##参考資料
Pythonチュートリアル: https://docs.python.org/ja/3/tutorial/
8章: https://docs.python.org/ja/3/tutorial/errors.html
書籍: https://www.oreilly.co.jp/books/9784873117539/
#"8章 エラーと例外"
- Python3 エンジニア認定基礎試験の配点
- 4 / 40問(10.0%) ☆☆★★★(重要度:中-)
- テーマ
- 構文エラー
- 例外(ビルトイン例外とユーザー定義例外)
- 例外処理(try, except, else, finally)
- raise文
#8.1 構文エラー
- **構文エラー (SyntaxError)**は、**パーサ(構文解釈器)**によって実行前に検知される。
- パーサは構文エラーが最初に見つかった場所を小さな矢印で示す。
- エラーの原因は矢印より前のトークンにある。
- ファイル名と行番号も表示される。
#8.2 例外
-
例外 (exception) は実行中に検知される。以下の二種類がある。
- ビルトイン例外 ... Pythonが用意している組み込み例外。
- ユーザー定義例外 ... ユーザーが自分で定義した例外。
- 例外には様々な型があり、型はメッセージに記されている。
- ビルトイン例外では、型とメッセージに出る名前は必ず一致する。
- ユーザー定義例外では、一致は任意。
- 例外のほとんどはプログラムで処理されず、結果はエラーメッセージにあらわれる。
- エラーメッセージ前半には、例外が起きたコンテキストがスタック・トレースバックの形で示される。
- 標準入力から読み込んだ行については表示しない。
- エラーメッセージ最終行には、何が起きたかが書かれる。
- 行の後半に例外の型と原因の詳細が示される。
- エラーメッセージ前半には、例外が起きたコンテキストがスタック・トレースバックの形で示される。
#8.3 例外の処理
-
try文により、選択した例外を処理することができる。
try文は以下で構成される。try節とexcept節は必須で、else節とfinally節は省略可能。-
try節
try: の下のブロック。try文の一番上に書く。
例外が送出されるかも知れない処理を書く。 -
except節
except [例外名] [as 変数名]: の下のブロック。try節の下に書く。
例外が送出された際の処理を書く。- 複数のexcept節を書くことも可能。
- 例外名を省略した場合、全ての例外をキャッチできる。
- as 変数名 を記載した場合、変数に例外のインスタンスが代入される。
- 引数はargs属性に格納される。
- 例外インスタンスには __str()__ メソッドが定義されているため、args属性を参照せずに直接 print(インスタンス名) でも表示できる。
- 例外をタプルで列挙することにより、一つのexcept節で複数の例外をキャッチすることも可能。
-
else節
else: の下のブロック。except節の下に書く。
try節で例外が送出されなかった場合の処理を書く。 -
finally節
finally: の下のブロック。try文の一番下に書く。
try文の最後のクリーンアップ処理を書く。
-
try節
- try文の実行順序は以下の通り。
- try節が最初に実行される。
- try節中で例外が送出されなければexcept節がスキップされる。
- else節があれば、それを実行する。
- try節の中で例外が送出されると、try節の残りの処理とelse節はスキップされる。
- 例外と一致するexcept節がある場合、それを実行する。
- 例外と一致するexcept節がない場合、上位のtry文があればそこへ例外を再送出する。
- finally節があれば、再送出前に実行される。
- 上位のtry文もない場合、未処理例外 (unhandled exception) メッセージを表示して処理を終了する。
- try節から直接的・間接的にコールされた関数内で発生した例外もexcept節の処理対象になる。
- finally節があれば、例外の送出の有無を問わず実行してtry文を終了する。
#8.4 例外の送出
-
raise文により、プログラム上で指定した例外を強制的に送出することもできる。
- raise [例外] の形式で書く。
- 指定する例外は、例外クラスでも、例外インスタンスでも可。
- except節の中で引数を指定せず raise とのみ書いた場合、キャッチした例外を最送出する。
#8.5 ユーザー定義例外
- 独自の例外クラスを作成して扱うこともできる。
- 例外クラスは、通常はExceptionクラスから派生したクラスにするべきである。
- 例外クラスの名前は、標準例外と同様に "~Error" という名前にするべきである。
- 通常のクラスと同様に、例外クラスでもメソッドのオーバーライドなどができるが、あまり複雑なことは普通やらない。
- いろいろなエラーを送出するモジュールを書く際は、最初に例外のベースクラスを定義して、個別のエラーはそのサブクラスとして扱うことが多い。
#8.6 クリーンアップ動作の定義
- クリーンアップ処理はfinally節 (->8.3 例外の処理) で定義する。
- 外部リソースの開放など、例外の有無にかかわらず実行したい処理に使う。
- except節で対応していない例外があった場合、finally節の処理を実行してから再送出する。
- try文内の他の節からbreakやcontinueやretuenなどで抜ける際にもfinally節は実行される。
#8.6.1 オブジェクトに定義してあるクリーンアップ動作 - オブジェクトの中には、不要になった際のクリーンアップ処理が定義されているものもある。
- オブジェクトの処理にwith文を使うと、使用後すぐにPythonが適切な方法でクリーンアップしてくれる。
次の記事:Pythonチュートリアル(9章)の内容を箇条書きでまとめた(作成中)