Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでexcept句内で発生した例外を処理する方法

```html

except句内で発生した例外を処理するには?

Pythonでは、tryブロックで発生した例外を捕捉するために書いたexcept句の中で、さらに別の例外が発生するケースがあります。このような場合も、except句を入れ子(ネスト)にすることで、二段階目の例外をきちんと処理できます。

次の例では、未定義の変数を参照して例外が発生し、それを受け取ったexcept句の中で今度はゼロ除算(ZeroDivisionError)が起こります。内側のtry-exceptでこれを捕捉し、sys.exc_info()を使って例外の詳細情報を取得して表示しています。

コード例

import sys

try:
    a = john          # 未定義の名前を参照 → 例外が発生
except:
    try:
        4 / 0         # except句内で ZeroDivisionError が発生
    except:
        print(sys.exc_info())

実行結果

(<class 'ZeroDivisionError'>, ZeroDivisionError('division by zero'), <traceback object at 0x0000000002BD4B88>)

sys.exc_info() の戻り値について

sys.exc_info()は、現在処理中の例外に関する情報を3つの要素からなるタプルとして返します。

  • 第1要素: 例外クラス(例: <class 'ZeroDivisionError'>
  • 第2要素: 実際に発生した例外インスタンス
  • 第3要素: 呼び出しスタックの状態を表すトレースバックオブジェクト

補足:Python 3の例外チェーン

Python 3では、except句の処理中に新たな例外が発生すると、「During handling of the above exception, another exception occurred」というメッセージとともに、元の例外との因果関係が自動的に表示されます。また、raise 新しい例外 from 元の例外という構文を使えば、意図的に例外を連鎖させることも可能です。これにより、except句内で起きたエラーの原因をより追跡しやすくなっています。

  1. Pythonのリスト内包表記で例外をキャッチするには?原因と対処法を解説

    Pythonには、例外を処理したり無視したりするための組み込み関数は存在しません。そのため、リスト内包表記の中ですべての例外を処理することは不可能です。 その理由は、リスト内包表記が「式(expression)」で構成されている点にあります。例外のキャッチや無視、ハンドリングを行えるのは「文(statement)」である try〜except ブロックだけだからです。式の中に try-except を埋め込むことは、Pythonの文法上できません。 現実的な回避策:関数へ処理を委譲する この制限に対する実用的な解決策のひとつが、例外が発生しうる部分式の評価を「関数」に委譲する方法です。関数の中

  2. Pythonで関数が例外を発生させることをテストする方法(unittestのassertRaises活用)

    Pythonのユニットテストでは、「関数が期待どおりの例外を投げない場合にのみ失敗する」というテストを書くことができます。これは、型安全性やエラーハンドリングの正しさを検証するうえで非常に重要な手法です。ここでは、Python標準ライブラリの unittest を使って、関数が例外をスローすることを確認する方法を解説します。例外発生をテストするサンプルコードたとえば、整数と文字列を足し合わせると TypeError が発生することを確認するコードは、以下のように書けます。Pythonシェルにそのまま貼り付けて実行できます。import unittest class MyTestCase(uni