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


前の記事: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節中で例外が送出されなければ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章)の内容を箇条書きでまとめた(作成中)