Latest web development tutorials

Pythonの例外処理

Pythonは、操作中に表示された例外やエラーのpythonプログラムを処理するために2つの非常に重要な機能を提供します。 あなたは、デバッグPythonプログラムにこの機能を使用することができます。

  • 例外処理:Pythonのチュートリアルサイト固有の記述。
  • Pythonのチュートリアルサイト固有の説明:(アサーション)をアサートします。

Pythonの標準的な例外

例外名 説明
BaseException すべての例外の基底クラス
SystemExitを 通訳要求は終了します
KeyboardInterrupt (通常は^ Cを入力してください)の実行割り込みユーザー
例外 一般的なエラーの基本クラス
呼び出すとStopIteration これ以上の値をイテレータありません
GeneratorExit 異常終了を通知するための発電機(発電機)
StandardError 内蔵の標準ベース・クラスのすべての例外のために
ArithmeticError すべての数値誤差の基底クラス
FloatingPointError 浮動小数点演算誤差
OverflowErrorを 数値演算は、上限を超えて
ZeroDivisionError (または弾性率)に加えて、ゼロ(すべてのデータ型)
AssertionErrorが アサーション失敗
AttributeError このオブジェクトはプロパティを持ちません
例外EOFError 入力を内蔵せず、EOFマーカーを到着なし
EnvironmentError オペレーティング・システム・エラー・ベースクラス
例外IOError 入力/出力操作が失敗します
OSErrorの オペレーティングシステムエラー
WindowsError システムコールが失敗しました。
ImportError インポートモジュール/オブジェクトに失敗しました
LookupErrorが 無効なクラスのデータベースクエリ
IndexError このシーケンスインデックス(指数)なし
KeyError例外 このキーマッピングなし
MemoryError メモリオーバーフローエラー(Pythonインタプリタのために致命的ではありません)
NameError 宣言されていない/オブジェクトを初期化(ないプロパティ)
UnboundLocalError アクセス初期化されていないローカル変数
ReferenceError 弱参照オブジェクト(弱参照は)のガベージコレクションにアクセスしようとしています
例外RuntimeError 一般的なランタイムエラー
NotImplementedError この方法は、実装されていません
SyntaxError Pythonの構文エラー
IndentationError インデントエラー
TabError タブとスペースミックス
SystemError 通常、通訳システムエラー
例外TypeError 無効な操作タイプ
ValueError 渡された引数が無効です
UnicodeError ユニコード関連のエラー
UnicodeDecodeError エラーのUnicodeのデコード
UnicodeEncodeErrorを Unicodeコードエラー
UnicodeTranslateError Unicode変換エラー
警告 警告の基底クラス
DeprecationWarning 廃止予定の機能に関する警告
FutureWarning セマンティクスの将来の構造に関する警告が変更されました
OverflowWarning 約自動的に長整数(ロング)のに昇格古い警告
PendingDeprecationWarning これは、廃棄物の特性に関する警告になります
RuntimeWarning 不審なランタイム動作(ランタイム動作)警告
SyntaxWarning 不審な構文の警告
UserWarning ユーザーコードの生成を警告

何が異常なのですか?

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

通常の状況下では、Pythonプログラムが例外を正しく処理しない場合に発生します。

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

私たちは、そうでない場合は、プログラムが終了します、それを扱うキャプチャする必要があるときにPythonスクリプト例外が発生します。


例外処理

あなたは、try / except文を使用して例外をキャッチすることができます。

文がステートメントを除いて、例外をキャッチし、情報を処理するように、tryブロック内のエラーを検出するために使用されることを除いて/してみてください。

あなたがしたくない場合は、プログラムの最後には、すぐ内側にそれをキャッチしようとすると、例外が発生します。

構文:

以下は除いて...他の構文....シンプルな試みです。

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

句を試して、異常が発生したときにするようにtry文は、Pythonは、現在のプログラムのコンテキスト内でマークされますされて出発してここに戻ってすることができたときに、作品を試してみてくださいが最初に実行され、次に起こることは、実行に依存します例外が存在するかどうか。

  • あなたは後に、pythonの句を除き、第1のマッチングを試してみて、実行するためにジャンプバックが例外である文は、例外処理が完了したときに例外が時間を処理し、新たにトリガされていない限り、コントロールが(try文全体を通して上の流れを実行しようとすると、例外が発生した場合例外)。
  • 異常が年後にtry文で発生しませんが、except節一致した場合、例外は、tryの先頭に、または(プログラムを終了し、デフォルトのエラーメッセージが出力されます)プログラムの先頭に提出されます。
  • あなたが句をしようとすると例外が発生した場合は実行されない(そして、それ以外の場合)、それ以外のpythonのステートメントは、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:
    正常的操作
   ......................
except(Exception1[, Exception2[,...ExceptionN]]]):
   发生以上多个异常中的一个,执行这块代码
   ......................
else:
    如果没有异常执行这块代码

試して-finally文

試して-最終的に例外が発生するかどうかのステートメントは、最終的なコードを実行します。

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ブロックで例外をスローすると、最終的にはすぐにコードのブロック。

最後に実行した後、すべての文をブロックし、例外が再びトリガされ、ブロック符号を除いて実行されます。

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


異常なパラメータ

例外は異常情報の出力パラメータとして、パラメータを取ることができます。

あなたは次のように除いて、パラメータ文を使用して例外をキャッチすることができます。

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

外れ値の変数は、一般的に受信例外ステートメントに含まれます。 タプルの形式の変数は、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 [Exception [, args [, traceback]]]

例外文は例外の型である(例えば、NameError)パラメータが異常なパラメータ値があります。 このパラメータは、提供されていない場合は、例外引数が "None"の、任意です。

トレース例外オブジェクトがある場合、最後の引数は、(実際にはほとんど使用されない)はオプションです。

例外は、文字列、クラスやオブジェクトにすることができます。 カーネルが提供するPythonの例外は、ほとんどがクラスのインスタンスのパラメータであるクラスのインスタンスです。

例外の非常に単純な定義、次のように:

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

注:「以外」は、例外をキャッチすることができるようにするには文では、同一の例外クラスオブジェクトまたは文字列をスローすることが有用でなければなりません。

たとえば、次のように我々は例外以上を捕獲、「除く」文は、次のとおりです。

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

#!/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)

ユーザー定義の例外

新しい例外クラスを作成することにより、プログラムは独自の例外を指定することができます。 典型的な例外は、直接または間接的に、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