実際にプログラムをデバッグするプロセスでは、例外のタイプのみを取得するだけでは不十分な場合があり、問題を解決するために、より詳細な例外情報に頼る必要があります。
例外をキャッチする場合、より多くの例外情報を取得するには2つの方法があります。
- sysモジュールでexc_infoメソッドを使用します。
- トレースバックモジュールで関連する関数を使用します。
このセクションでは、最初にsysモジュールのexc_info()メソッドを使用して、より多くの例外情報を取得する方法を紹介します。
sysモジュールの詳細については、「Python sys module」を参照してください。
モジュールsysには、exc_info()とlast_traceback()の例外のすべての情報を返すことができる2つのメソッドがあります。これらの2つの関数の機能と使用法は同じです。このセクションでは、例としてexc_info()メソッドのみを使用します。
exc_info()メソッドは、現在の例外情報をタプルの形式で返します。タプルには、タイプ、値、トレースバックの3つの要素が含まれています。これらの意味は次のとおりです。
- type:例外タイプの名前。BaseExceptionのサブクラスです( Python 例外クラスの場合、「Pythonの一般的な例外タイプ」のセクションを参照できます)
- 値:キャッチされた例外インスタンス。
- traceback:はトレースバックオブジェクトです
コード例:
sysモジュールを使用する前に、import を使用してimport sys try を インポートする必要があります。 x = int(input(" 配当を入力してください:" )) print(" 30で割った"、x、"に等しい"、30 / x) 以外: print (sys.exc_info()) print(" その他の例外... 。")
0を入力すると、プログラムの操作結果は次のようになります。
配当金を入力してください:0 ( < クラス ' ZeroDivisionError ' >、ZeroDivisionError(' ゼロ除算'))、<0x000001FCF638DD48のトレースバックオブジェクト> ) その他の異常...
出力の2行目は、スローされた例外に関するすべての情報です。これは3つの要素を持つタプルです。最初の要素はZeroDivisionErrorクラス、2番目の要素は例外タイプZeroDivisionErrorクラスのインスタンス、3番目の要素は各要素はトレースバックオブジェクトです。このうち、スローされた例外のタイプと説明情報は最初の2つの要素から確認できます。3番目の要素はトレースバックオブジェクトであり、例外に関する情報を直接確認することはできないため、追加の処理が必要です。
トレースバックオブジェクトに含まれるコンテンツを表示するには、最初にトレースバックモジュールを導入してから、トレースバックモジュールでprint_tbメソッドを呼び出し、sys.exc_info()によるトレースバックオブジェクト出力をパラメーターとして取得する必要があります。たとえば、次のとおりです。
#sysのモジュールの前に、使用インポート導入 インポートSYS #導入トレースバックモジュールの インポートは、トレースバック を試して: X = INT(INPUT(" :配当を入力" )) プリント(" 30分割"、X、" 等しい"、30 / X) を除く: #プリント(sys.exc_info()) traceback.print_tb(SYS。 exc_info()[2 ]) print(" その他の例外... ")
0を入力すると、プログラムの実行結果は次のようになります。
配当金を入力してください:0 ファイル" C:\ Users \ mengma \ Desktop \ demo.py "、7行目、 <module>で 印刷(" 30除以"、x、" 等号"、30 / x) その他の異常...
ご覧のとおり、出力情報には、ファイル名、例外がスローされる行数、例外をスローする特定のコードなど、より多くの例外情報が含まれています。
print_tbメソッドは、トレースバックモジュールの多くのメソッドの1つにすぎません。トレースバックモジュールに関するより多くの異常な情報を取得する方法については、後続の章で詳しく紹介します。