Pythonの例外処理


Python は、Python プログラムの実行中に発生する例外とエラーを処理するための 2 つの非常に重要な関数を提供します。この機能を使用して、Python プログラムをデバッグできます。

  • 例外処理: このサイトの Python チュートリアルで詳しく紹介されています。

  • アサーション: このサイトの Python チュートリアルで詳しく紹介します。


Pythonの標準例外

例外名説明


BaseExceptionすべての例外の基本クラス
SystemExit終了するためのインタープリターリクエスト
KeyboardInterruptユーザーが実行を中断する(通常は^Cを入力する)
例外 一般エラー 基本クラス
StopIterationイテレータにはこれ以上値がありません
GeneratorExitジェネレータはexitに通知する例外を生成します
StandardErrorすべての組み込み標準例外の基本クラス
算術エラーすべての数値計算エラーの基本クラス
FloatingPointError浮動小数点計算エラー
OverflowError数値演算が上限を超えています
ZeroDivisionErrorDivision (またはmodulo)ゼロ (すべてのデータ型)
AssertionErrorアサーションステートメントが失敗しました
AttributeErrorオブジェクトにはそのような属性がありません
EOFError組み込み入力がありません、EOFフラグに達しました
環境エラーOSエラーベースクラス
IOError入出力操作が失敗しました
OSErrorオペレーティングシステムエラー
WindowsErrorシステムコールが失敗しました
ImportErrorモジュール/オブジェクトのインポートに失敗しました
LookupError 無効なデータ検索の基本クラス
IndexErrorシーケンス内にそのようなインデックスはありません
KeyErrorマップ内にそのようなキーはありません
MemoryErrorメモリオーバーフローエラー(Pythonインタープリタの場合)ではありません致命的)
NameError未宣言/初期化オブジェクト (プロパティなし)
UnboundLocalError初期化されていないローカル変数へのアクセス
ReferenceErrorガベージコレクションされたオブジェクトへのアクセス
ランタイムエラー一般的なランタイムエラー
NotImplementedError未実装のメソッド
SyntaxErrorPython構文エラー
IndentationErrorインデントエラー
TabErrorタブとスペースが混在
SystemError全般インタプリタ システム エラー
TypeError type に対する無効な操作
ValueError 無効なパラメータが渡されました
UnicodeErrorUnicode 関連のエラー
UnicodeDecodeError Unicodeデコードエラー
UnicodeEncodeError Unicodeエンコードエラー
UnicodeTranslateError Unicode変換エラー
Warning 警告の基本クラス
DeprecationWarning非推奨の機能に関する警告
FutureWarningセマンティクスが変更される構成要素に関する警告将来変更される
OverflowWarninglongへの自動昇格に関する古い警告タイプ(long)
PendingDeprecationWarning非推奨となる機能に関する警告
RuntimeWarning疑わしい実行時の動作に対する警告
SyntaxWarning疑わしい構文に対する警告
UserWarningユーザーコードによって生成された警告

例外とは何ですか?

例外とは、プログラムの実行中に発生し、プログラムの通常の実行に影響を与えるイベントです。

一般に、Python がプログラムを正常に処理できない場合に例外が発生します。

Exceptions は、エラーを表す Python オブジェクトです。

Python スクリプトで例外が発生した場合、それをキャッチして処理する必要があります。そうしないと、プログラムの実行が終了します。


例外処理

例外をキャッチするには、try/Except ステートメントを使用できます。

try/exc ステートメントは、try ステートメント ブロック内のエラーを検出するために使用されます。これにより、Except ステートメントは例外情報を取得して処理できるようになります。

例外が発生したときにプログラムを終了したくない場合は、try でキャッチしてください。

構文:

以下は簡単な try....excel...else 構文です:

try:
<语句>        #运行别的代码
except <名字>:
<语句>        #如果在try部份引发了'name'异常
except <名字>,<数据>:
<语句>        #如果引发了'name'异常,获得附加的数据
else:
<语句>        #如果没有异常发生

try の動作原理は、try ステートメントを開始した後、Python はそのコンテキストでそれを実行するということです。現在のプログラム 例外が発生したときにここに戻ることができるようにマークします。try 句が最初に実行され、次に何が起こるかは実行中に例外が発生したかどうかによって異なります。

  • try の後のステートメントの実行時に例外が発生した場合、Python は try に戻り、例外に一致する最初の else 句を実行します。例外が処理された後、制御フローは try ステートメント全体を通過します。例外が処理されていない限り、新しい例外がスローされます)。

  • try の後のステートメントで例外が発生したが、一致する例外句がない場合、例外は上位の try またはプログラムの最上位レベルに送信されます (これにより、プログラムが終了し、デフォルトの結果が出力されます)エラー情報)。

  • try 句の実行時に例外が発生しない場合、Python は else ステートメントの後にステートメントを実行し (else がある場合)、制御フローは try ステートメント全体を通過します。

以下は簡単な例です。ファイルを開いてファイルの内容を書き込みますが、例外は発生しません:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print "Error: 没有找到文件或读取文件失败"
else:
    print "内容写入文件成功"
    fh.close()

上記のプログラムの出力:

$ python test.py 
内容写入文件成功
$ cat testfile       # 查看写入的内容
这是一个测试文件,用于测试异常!!

以下は簡単な例では、ファイルを開いてファイルにコンテンツを書き込みますが、ファイルには書き込み権限がないため、例外が発生します:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
except IOError:
    print "Error: 没有找到文件或读取文件失败"
else:
    print "内容写入文件成功"
    fh.close()

コードを実行する前にテストするため、最初に書き込み権限を削除できます。 testfile ファイルのコマンドは次のとおりです:

chmod -w testfile

上記のコードを再度実行します:

$ python test.py 
Error: 没有找到文件或读取文件失败

例外タイプなしで例外を使用します

次の例に示すように、例外タイプなしで例外を使用できます:

try:
    正常的操作
   ......................
except:
    发生异常,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

上記の方法で try-excel ステートメントによってキャプチャされた、発生するすべての例外。しかし、これは良い方法ではなく、このプログラムを通じて特定の異常情報を特定することはできません。すべての例外をキャッチするためです。


複数の例外タイプでのExceptを使用します

以下に示すように、同じExceptステートメントを使用して複数の例外メッセージを処理することもできます:

try:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

try-finallyステートメント

try-finallyステートメントnot Exception は最後のコードを実行します。

try:
<语句>
finally:
<语句>    #退出try时总会执行
raise

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    fh.write("这是一个测试文件,用于测试异常!!")
finally:
    print "Error: 没有找到文件或读取文件失败"

開かれたファイルに書き込み権限がない場合、出力は次のようになります:

$ python test.py 
Error: 没有找到文件或读取文件失败

同じ例を次のように書くこともできます:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

try:
    fh = open("testfile", "w")
    try:
        fh.write("这是一个测试文件,用于测试异常!!")
    finally:
        print "关闭文件"
        fh.close()
except IOError:
    print "Error: 没有找到文件或读取文件失败"

try ブロックで例外がスローされた場合、 finally ブロックのコードはすぐに実行されます。

finally ブロック内のすべてのステートメントが実行された後、例外が再度トリガーされ、excel ブロッ​​ク コードが実行されます。

パラメータの内容は例外とは異なります。


例外パラメータ

例外にはパラメータを含めることができ、出力例外情報パラメータとして使用できます。

以下に示すように、Except ステートメントを通じて例外パラメータをキャプチャできます:

try:
    正常的操作
   ......................
except ExceptionType, Argument:
    你可以在这输出 Argument 的值...

変数によって受け取られる例外値は、通常、例外ステートメントに含まれます。タプル形式の変数は 1 つ以上の値を受け取ることができます。

タプルには通常、エラー文字列、エラー番号、エラー位置が含まれます。

以下は 1 つの例外の例です:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 定义函数
def temp_convert(var):
    try:
        return int(var)
    except ValueError, Argument:
        print "参数没有包含数字\n", Argument

# 调用函数
temp_convert("xyz");

上記のプログラムの実行結果は次のとおりです:

$ python test.py 
参数没有包含数字
invalid literal for int() with base 10: 'xyz'

例外をトリガーする

raise ステートメントを使用して例外を自分でトリガーできます

Raise構文形式は次のとおりです。ステートメント内の

raise [Exception [, args [, traceback]]]

Exception は例外のタイプ (例: NameError)、引数は例外パラメーター値です。このパラメータはオプションです。指定しない場合、例外パラメータは「なし」になります。

最後のパラメータはオプションであり (実際にはほとんど使用されません)、存在する場合はトレース例外オブジェクトです。

インスタンス

例外は文字列、クラス、またはオブジェクトです。 Python カーネルによって提供される例外のほとんどは、クラスのインスタンスのパラメーターであるインスタンス化されたクラスです。

例外の定義は、次のように非常に簡単です:

def functionName( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行

注: 例外をキャッチできるようにするには、「excel」ステートメントはクラス オブジェクトまたは文字列をスローするのと同じ例外を使用する必要があります。

たとえば、上記の例外をキャッチした場合、「例外」ステートメントは次のようになります:

try:
    正常逻辑
except "Invalid level!":
    触发自定义异常    
else:
    其余代码

Instance

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 定义函数
def mye( level ):
    if level < 1:
        raise Exception("Invalid level!", level)
        # 触发异常后,后面的代码就不会再执行

try:
    mye(0)                // 触发异常
except "Invalid level!":
    print 1
else:
    print 2

上記のコードを実行すると、出力結果は次のようになります:

$ python test.py 
Traceback (most recent call last):
  File "test.py", line 11, in <module>
    mye(0)
  File "test.py", line 7, in mye
    raise Exception("Invalid level!", level)
Exception: ('Invalid level!', 0)

ユーザー定義の例外

を作成することで新しい例外クラスでは、プログラム Exceptions 自体に名前を付けることができます。例外は通常、直接または間接的に Exception クラスから継承する必要があります。

以下は RuntimeError に関連する例です。この例では、基本クラスは RuntimeError であり、例外がトリガーされたときに詳細情報を出力するために使用されます。

try ステートメント ブロックでは、ユーザー定義の例外の後に、変数 e を使用して Networkerror クラスのインスタンスが作成されます。

class Networkerror(RuntimeError):
    def __init__(self, arg):
        self.args = arg

上記のクラスを定義した後、次のように例外をトリガーできます:

try:
    raise Networkerror("Bad hostname")
except Networkerror,e:
    print e.args