最終更新日:2020-09-23第18回.例外処理(try文)とexception一覧スクリプトを実行したときには各種の例外(エラー)が発生することがあります。スクリプトを書いて実行し、エラーが出れば修正してまた実行する。これを繰り返すことでエラーのないプログラムが完成していきます。エラーが出ないように完全に対処することは極めて困難です。それは、プログラムの動作環境(データや外部環境)がその時々で変わるため、これらを完全には考慮しきれないからです。Pythonは例外(エラー)発生を検知すると、トレースバックを出力しプログラムの実行を強制終了します。場合は強制終了されては困るものです。Pythonには例外発生時に強制終了させずに例外を検知する手段としてtry文が用意されています。例外処理とはPythonは例外発生を検知すると、トレースバックを出力しプログラムの実行を強制終了します。Error)については、エラーの補足はできません。print(substr3(s))上記のスクリプトを実行するとエラーが発生します。続行すると、さらに続行すると、IDLEの画面デバッグについてトレースバックにはデバッグに必要な情報が出ています。range文字列のインデックスが範囲外になっていることが分かります。s[2]このような順番で実行されたことも分かります。s[2]ここでインデックスが範囲外になったことが分かります。引数の文字列を確認して、適切な対処する必要があります。関数作成時には、どのような引数が渡されてくるか考慮しきれない場合があります。そのような場合でもスクリプトが強制終了されることなく処理を続けるためにtry文がPythonには用意されています。※もちろん上記の場合は文字列長を判定して何らかの対処をしたほうが良いです。try文の文法をみた上で、実際にスクリプトにtry文を組み込んでエラーを捕捉していきます。try文の文法ひとまとめの文に対して、例外処理および/またはクリーンアップコードを指定します。少なくとも1つ以上のexcept節を指定します。複数のexcept節を記述できます。例外が発生すると、except節を上から逐次、発生した例外に対応するまで調べます。例外ハンドラを省略したexceptは最後に書かなければならず、これは全ての例外に対応します。例外ハンドラが書かれたexcept節に対しては式が評価され、結果のオブジェクトが指定した例外と互換である場合にその節が対応します。例外がどのexcept節にも合致しなかった場合、現在のコードを囲うさらに外側、そして呼び出しスタックへと検索を続けます。いずれのexcept節にも合致しなかった場合は、例外発生によって実行は強制終了されます。複数の例外ハンドラに対して同一の処理を行う場合は、()括弧の中に,カンマ区切りで複数の例外ハンドラを列挙します。識別子except節内で例外オブジェクトを利用する場合に指定します。識別子(変数)に例外オブジェクトが格納されます。この識別子(変数)はexcep節の最後にクリアされるで、他で使用することはできません。省略可能なオプションです。例外(エラー)が発生しなかった場合のみ実行されます。else節で起きた例外は、手前にあるexcept節では処理されません。省略可能なオプションです。エラーの有無に関わらず実行されます。finally節で起きた例外は、手前にあるexcept節では処理されません。上記の説明文ではexcept節の使い方が分かりづらいと思います。例外ハンドラの指定やtry文のネストについての挙動を理解してください。先のスクリプトを例にtry文を順次組み込んでいきます。rangeこのエラーになります。try文を入れてスクリプトが停止しないようにします。例外ハンドラを省略したexceptforループ全体をtry文の中に入れてみます。print("エラー発生")例外ハンドラを省略しているので全てのエラーが捕捉できます。上記を実行すると、エラーの捕捉はできていますが、そこでforループが終了してしまいます。エラーになった場合でもforループを継続したい場合は、forの中にtry文を入れます。print("エラー発生")例外ハンドラを指定したexceptexcept節で具体的な例外ハンドラを指定します。print(f"{s}:{e}")この場合はIndexError以外の例外には対応されません。print(f"{s}:{e}")複数の例外ハンドラの指定except節に指定する例外ハンドラを複数指定します。print(f"{s}:{e}")2つの例外に対応できていることが確認できます。上記の2つのexcept節は中の処理が同じなので、1行にすることができます。print(f"{s}:{e}")これでIndexErrorとTypeErrorの例外に対応できていますが、その他の例外が発生した場合はスクリプトが強制終了します。想定外の例外でも終了しないようにするなら、以下のように例外ハンドラを指定しないexcept節を最後に付けておきます。print("想定外のエラー")try文のネストtry文の中にtry文を入れて使います。print(f"{s}:{e}")for文の中のtryでは、IndexErrorのみに対処しています。IndexError以外の例外が発生した場合は、for文の中のtryでは例外を補足できません。この場合の例外発生時には、さらに上のレベル(外側)にtryがあるか探索されます。tryがあり、合致するexcept節があればそこで補足されます。上記スクリプトでは、IndexErrorはfor内のtryが捕捉し、TypeErrorは外側のtryが捕捉しています。関数の中と呼び出し元の両方でtry文を使う関数の中にtry文があり、その関数を呼び出しがtry文の中にある場合です。print(f"{s}:{e}")関数の中のtryでは、IndexErrorのみに対処しています。IndexError以外の例外が発生した場合は、関数の中のtryでは例外を補足できません。この場合、例外発生時には、関数の呼び出し元にtryがあるか探索されます。tryがあり、合致するexcept節があればそこで補足されます。上記スクリプトでは、IndexErrorは関数内のtryが捕捉し、TypeErrorは呼び出し元のtryが捕捉しています。else節とfinally節else節とfinally節について、それぞれの挙動を理解しておきましょう。print("完了しました。")else節は例外が発生しなかった場合のみ処理されるので、上記では実行されていません。入力するデータを以下に変更してみます。("Python","VBA","GAS","PHP","C##")例外が発生しないのでelse節が処理されています。finally節は常に処理されていることが確認できます。以下の一覧のリンクは、公式ドキュメントの当該の例外にリンクしています。全ての組み込み例外の基底クラスです。(継承にはExceptionを使ってください)。システム終了以外の全ての組み込み例外はこのクラスから派生しています。全てのユーザ定義例外もこのクラスから派生させるべきです。バッファに関連する操作が行えなかったときに送出されます。マッピングまたはシーケンスで使われたキーやインデクスが無効な場合に送出される例外IndexErrorおよびKeyErrorの基底クラスです。assert文が失敗した場合に送出されます。(オブジェクトが属性の参照や属性の代入をまったくサポートしていない場合にはTypeErrorが送出されます)。達した場合に送出されます。現在は使われていません。ジェネレータやコルーチンが閉じられたときに送出されます。この例外はエラーではなく技術的なものなので、ExceptionではなくBaseExceptionを直接継承しています。import文でモジュールをロードしようとして問題が発生すると送出されます。(訳注:...の部分)の名前が見つからないときにも送出されます。ImportErrorのサブクラスで、import文でモジュールが見つからない場合に送出されます。sys.modulesにNoneが含まれる場合にも送出されます。シーケンスの添字が範囲外の場合に送出されます。(スライスのインデクスはシーケンスの範囲に収まるように暗黙のうちに調整されます。インデクスが整数でない場合、TypeErrorが送出されます。キーが、既存のキーの集合内に見つからなかった場合に送出されます。押した場合に送出されます。実行中、割り込みは定期的に監視されます。Exceptionを捕捉するコードに誤って捕捉されてインタプリタの終了が阻害されないように、この例外はBaseExceptionを継承しています。復旧可能かもしれない場合に送出されます。ローカルまたはグローバルの名前が見つからなかった場合に送出されます。名前のみに適用されます。関連値は見つからなかった名前を含むエラーメッセージです。この例外はRuntimeErrorから派生しています。ユーザ定義の基底クラスにおいて、抽象メソッドが派生クラスでオーバライドされることを要求する場合にこの例外を送出しなくてはなりません。クラスは実装中であり本来の実装を追加する必要があることを示します。この例外はシステム関数がシステム関連のエラーを返した場合に送出されます。算術演算の結果が表現できない大きな値になった場合に送出されます。(むしろMemoryErrorが送出されることになるでしょう)。送出されることがあります。浮動小数点演算の例外処理は標準化されていないので、ほとんどの浮動小数点演算もチェックされません。この例外はRuntimeErrorを継承しています。超過を検出すると送出されます。プロキシを使って、ガーベジコレクションによって回収された後の参照対象オブジェクトの属性にアクセスした場合に送出されます。弱参照についてはweakrefモジュールを参照してください。他のカテゴリに分類できないエラーが検出された場合に送出されます。関連値は、何が問題だったのかをより詳細に示す文字列です。組込み関数next()とiteratorの__next__()メソッドによって、そのイテレータが生成するアイテムがこれ以上ないことを伝えるために送出されます。iteratorオブジェクトの__anext__()メソッドによって返される必要があります。パーザが構文エラーに遭遇した場合に送出されます。起こる可能性があります。正しくないインデントに関する構文エラーの基底クラスです。これはSyntaxErrorのサブクラスです。タブとスペースを一貫しない方法でインデントに使っているときに送出されます。これはIndentationErrorのサブクラスです。インタプリタが内部エラーを発見したが、状況は全ての望みを棄てさせるほど深刻ではないと思われる場合に送出されます。どの動作が失敗したかを示す文字列です。この例外はsys.exit()関数から送出されます。Exceptionをキャッチするコードに誤ってキャッチされないように、ExceptionではなくBaseExceptionを継承しています。これにより例外は上の階層に適切に伝わり、インタープリタを終了させます。インタープリタは終了します。組み込み演算または関数が適切でない型のオブジェクトに対して適用された際に送出されます。関連値は型の不整合に関して詳細を述べた文字列です。関数やメソッド内のローカルな変数に対して参照を行ったが、その変数には値が代入されていなかった場合に送出されます。関するエンコードまたはデコードのエラーが発生した際に送出されます。関連のエラーがエンコード中に発生した際に送出されます。関連のエラーがデコード中に発生した際に送出されます。関連のエラーが変換中に発生した際に送出されます。演算子や関数が、正しい型だが適切でない値を持つ引数を受け取ったときや、IndexErrorのようなより詳細な例外では記述できない状況で送出されます。あった場合に送出されます。関連値は文字列で、その演算における被演算子と演算子の型を示します。ブロックしそうになった場合に送出されます。子プロセスの操作が失敗した場合に送出されます。コネクション関係の問題の基底クラス。ConnectionErrorのサブクラスで、もう一方の端が閉じられたパイプに書き込こもうとするか、書き込みのためにシャットダウンされたソケットに書き込こもうとした場合に発生します。ConnectionErrorのサブクラスで、接続の試行が通信相手によって中断された場合に発生します。ConnectionErrorのサブクラスで、接続の試行が通信相手によって拒否された場合に発生します。ConnectionErrorのサブクラスで、接続が通信相手によってリセットされた場合に発生します。存在するファイルやディレクトリを作成しようとした場合に送出されます。要求されたファイルやディレクトリが存在しない場合に送出されます。システムコールが入力信号によって中断された場合に送出されます。ファイル操作が要求された場合に送出されます。ディレクトリ操作が要求された場合に送出されます。十分なアクセス権、例えばファイルシステム権限のない操作が試みられた場合に送出されます。与えられたプロセスが存在しない場合に送出されます。システム関数がシステムレベルでタイムアウトした場合に送出されます。見るTRIMRANGE関数(セル範囲をトリム:端の空白セルを除外)|エクセル入門(2024-08-30)正規表現関数(REGEXTEST,REGEXREPLACE,REGEXEXTRACT)|エクセル入門(2024-07-02)エクセルが起動しない、Excelが立ち上がらない|エクセル雑感(2024-04-11)ブール型(Boolean)のis変数・フラグについて|VBA技術解説(2024-04-05)テキストの内容によって図形を削除する|VBA技術解説(2024-04-02)ExcelマクロVBA入門目次|エクセルの神髄(2024-03-20)VBA10大躓きポイント(初心者が躓きやすいポイント)|VBA技術解説(2024-03-05)テンキーのスクリーンキーボード作成|ユーザーフォーム入門(2024-02-26)無効な前方参照か、コンパイルされていない種類への参照です。例外処理(try文)とexception一覧このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。掲載のVBAコードは動作を保証するものではなく、あくまでVBA学習のサンプルとして掲載しています。掲載のVBAコードは自己責任でご使用ください。万一データ破損等の損害が発生しても責任は負いません。例外処理(try文)とexception一覧このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。