Pythonチュートリアル(8章)の内容を箇条書きでまとめた

前の記事：Pythonチュートリアル(7章)の内容を箇条書きでまとめた(作成中)

#はじめに
[Python3 エンジニア認定基礎試験](https://www.pythonic-exam.com/exam/basic)対策として、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文**により、選択した例外を処理することができる。<br>try文は以下で構成される。try節とexcept節は必須で、else節とfinally節は省略可能。
    - **try節**<br>try: の下のブロック。try文の一番上に書く。<br>例外が送出されるかも知れない処理を書く。
    - **except節**<br>except [例外名] [as 変数名]: の下のブロック。try節の下に書く。<br>例外が送出された際の処理を書く。
        - 複数のexcept節を書くことも可能。
        - 例外名を省略した場合、全ての例外をキャッチできる。
        - as 変数名 を記載した場合、変数に例外のインスタンスが代入される。
            - 引数は**args属性**に格納される。
            - 例外インスタンスには **\_\_str()\_\_ メソッド**が定義されているため、args属性を参照せずに直接 print(インスタンス名) でも表示できる。
        - 例外をタプルで列挙することにより、一つのexcept節で複数の例外をキャッチすることも可能。
    - **else節**<br>else: の下のブロック。except節の下に書く。<br>try節で例外が送出されなかった場合の処理を書く。
    - **finally節**<br>finally: の下のブロック。try文の一番下に書く。<br>try文の最後の[クリーンアップ処理](https://qiita.com/Wakii/items/4ffcba348e31e7e141fc#86-%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%A2%E3%83%83%E3%83%97%E5%8B%95%E4%BD%9C%E3%81%AE%E5%AE%9A%E7%BE%A9)を書く。
- 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 例外の処理](https://qiita.com/Wakii/items/4ffcba348e31e7e141fc#83-%E4%BE%8B%E5%A4%96%E3%81%AE%E5%87%A6%E7%90%86)) で定義する。
    - 外部リソースの開放など、例外の有無にかかわらず実行したい処理に使う。
- except節で対応していない例外があった場合、finally節の処理を実行してから再送出する。
- try文内の他の節からbreakやcontinueやretuenなどで抜ける際にもfinally節は実行される。
#8.6.1 オブジェクトに定義してあるクリーンアップ動作
- オブジェクトの中には、不要になった際のクリーンアップ処理が定義されているものもある。
- オブジェクトの処理に**with文**を使うと、使用後すぐにPythonが適切な方法でクリーンアップしてくれる。

次の記事：Pythonチュートリアル(9章)の内容を箇条書きでまとめた(作成中)