11 . Python 3の異常、デバッグ、テスト
8435 ワード
12.Python 3入門の異常、デバッグとテスト
プログラムの実行中に、いろいろなエラーが発生します.整数を出力すべき結果が文字列を出力するなど、プログラムの作成に問題があるエラーがあります.このエラーは通常バグと呼ばれ、バグは修復しなければなりません.あるエラーはユーザ入力によるものであり、例えばユーザにemailアドレスを入力させた結果、空の文字列が得られ、このエラーはユーザ入力をチェックすることによって対応する処理を行うことができる.
もう1つのエラーは、ファイルを書き込むときにディスクがいっぱいになったり、書けなくなったり、ネットワークからデータをキャプチャしたりして、ネットワークが突然切れたりするなど、プログラムの実行中に予測できないものです.このようなエラーは例外とも呼ばれ、プログラムでは通常処理しなければならない.そうしないと、プログラムは様々な問題で終了し、終了する.
Pythonには異常処理メカニズムが内蔵されており、エラー処理を支援しています.
また、プログラムの実行を追跡し、変数の値が正しいかどうかを確認する必要があります.このプロセスはデバッグと呼ばれ、Pythonのpdbはコードを単一ステップで実行することができます.
最後に、作成テストも重要で、良好なテストがあれば、プログラムの修正後に繰り返し実行することができ、プログラムが私たちが作成したテストに合致することを確保することができる.
異常とは、プログラムの実行中にエラーが発生した信号(プログラムにエラーが発生した場合、例外が発生し、プログラムが処理されていない場合、その異常が投げ出され、プログラムの実行も終了する)であり、pythonでエラーが発生した異常は以下の通りである.エラーは2つに分けられる.
1.構文エラー(pythonインタプリタの構文検出に耐えられず、プログラム実行前に修正しなければならない)
2.論理エラー
Pythonにおける異なる異常は、異なるタイプ(Pythonにおいてクラスとタイプ、すなわちクラスが統一されている)で識別することができ、1つの異常は1つのエラーを識別することができる.
よくある例外
例外名
説明
AttributeError
オブジェクトにないツリーにアクセスしようとします.fooなどです.xですがfooには属性xがありません
IOError
入出力異常;基本的にファイルを開けません
ImportError
モジュールまたはパッケージを導入できません.基本的にはパスの問題または名前のエラーです
IndentationError
構文エラー(のサブクラス);コードが正しく整列していません
IndexError
下付きインデックスはシーケンス境界を超えており、例えばxが3つの要素しかないのにxにアクセスしようとしている[5]
KeyError
辞書に存在しないキーにアクセスしようとする
KeyboardInterrupt
Ctrl+Cが押される
NameError
オブジェクトがまだ与えられていない変数を使用
SyntaxError
Pythonコードは不正で、コードはコンパイルできません(個人的には文法が間違っていると思っていますが、書き間違えました)
TypeError
受信オブジェクトタイプと要件の不一致
UnboundLocalError
まだ設定されていないローカル変数にアクセスしようとしますが、基本的には同じ名前のグローバル変数があるため、アクセスしていると思っています.
ValueError
値のタイプが正しい場合でも、呼び出し元が望ましくない値を入力します.
その他の例外
例外名
説明
BaseException
すべての例外のベースクラス
SystemExit
インタプリタ要求終了
KeyboardInterrupt
ユーザ割り込み実行(通常は入力^C)
Exception
一般的なエラーのベースクラス
StopIteration
反復器にはこれ以上の値はありません
GeneratorExit
ジェネレータに異常が発生し、終了を通知
StandardError
すべての組み込み標準異常のベースクラス
ArithmeticError
すべての数値計算エラーのベースクラス
FloatingPointError
浮動小数点計算エラー
OverflowError
最大限度を超える数値演算
ZeroDivisionError
ゼロを除く(または型を取る)(すべてのデータ型)
AssertionError
アサーション文が失敗しました
AttributeError
オブジェクトにはこの属性がありません
EOFError
組み込み入力なしでEOFタグに到達
EnvironmentError
OSエラーのベースクラス
IOError
入出力操作に失敗しました
OSError
OSエラー
WindowsError
システム呼び出しに失敗しました
ImportError
モジュール/オブジェクトのインポートに失敗しました
LookupError
無効なデータ・クエリーのベース・クラス
IndexError
シーケンスにこのインデックスはありません(index)
KeyError
マッピングにこのキーはありません
MemoryError
メモリオーバーフローエラー(Pythonインタプリタでは致命的ではありません)
NameError
オブジェクトが宣言/初期化されていません(属性なし)
UnboundLocalError
初期化されていないローカル変数へのアクセス
ReferenceError
弱参照(Weak reference)は、ゴミ回収されたオブジェクトにアクセスしようとします.
RuntimeError
一般的なランタイムエラー
NotImplementedError
まだ実現されていない方法
SyntaxError
Python構文エラー
IndentationError
インデントエラー
TabError
Tabとスペースの混在
SystemError
一般的な解釈システムエラー
TypeError
タイプに無効なアクション
ValueError
無効なパラメータが入力されました
UnicodeError
Unicode関連エラー
UnicodeDecodeError
Unicode復号時のエラー
UnicodeEncodeError
Unicode符号化時エラー
UnicodeTranslateError
Unicode変換時エラー
Warning
警告ベースクラス
DeprecationWarning
廃棄されたフィーチャーに関する警告
FutureWarning
将来的に意味が変わるという警告について
OverflowWarning
古いオートリフト長型(long)に関する警告
PendingDeprecationWarning
特性が廃棄される警告について
RuntimeWarning
不審なランタイム挙動(runtime behavior)の警告
SyntaxWarning
不審な文法の警告
UserWarning
ユーザーコード生成の警告
プログラムの頑丈性とフォールトトレランス性を保証するために、すなわち、エラーが発生したときにプログラムがクラッシュしないように、異常を処理する必要がある.エラーが発生する条件が予知可能である場合、ifで処理する必要がある:エラーが発生する前に予防する.
誤って発生した条約が予知できない場合、使用するtry...Except:エラー発生後の処理
マルチブランチ
万能異常Exception
マルチブランチ異常と万能異常
もしあなたが望む効果は、どんな異常が発生しても、私たちは統一的に捨てたり、同じコードロジックを使って彼らを処理したりすることです.では、騒年、大胆にやりましょう.Exceptionがあれば十分です.もしあなたが望む効果は、異なる異常に対して異なる処理ロジックをカスタマイズする必要があるなら、マルチブランチを使用する必要があります.
マルチブランチ後のException
異常なその他の機構
try-finally文は、例外が発生するかどうかにかかわらず、最後のコードを実行します.
アクティブトリガ異常
カスタム例外
アサーション:assert条件
まとめるtry.except
ある学友会はこのように思って、异常な処理を学んだ后に、とても强大で、私は私のすべてのプログラムのためにtryをプラスします...except、干毛糸はそれが论理の间违いがあるかどうかを考えて、このようにとても良くて、多く脳の细胞===を省きます
まずtry...exceptはあなたが添付したプログラムの異常処理の論理で、あなたの主な仕事とは関係ありません.このようなものが多くなると、コードの可読性が悪くなります.
そして異常処理本はあなたの2 b論理のお尻拭き紙ではなく、エラーが発生した条件が予知できない場合にのみtry...exceptを加えるべきです.
エラーをキャプチャしなければ、Python解釈器にエラースタックを印刷させることは自然にできるが、プログラムも終了し、エラースタックを印刷することができ、エラーの原因を分析し、プログラムを実行し続けることができる.Pythonに内蔵logginモジュールは、エラー情報を非常に容易に記録することができる.
「テスト駆動開発」を聞いたことがあるなら、ユニットテストはよく知られていません.ユニットテストは、モジュール、関数、またはクラスに対して正確性検査を行うためのテスト作業である.たとえば、関数abs()では、次のいくつかのテスト例を記述できます.は、1、1.2/0などの正数を入力します.99,期待戻り値は入力値と同じ である.入力複素数、例えば-1、-1.2、-0.99は、入力と逆の戻り値を期待する. 入力0、期待戻り0 None,[],{}などの非数値タイプを入力し,TypeErrorの脱出を期待する.
上のテスト例をテストモジュールに入れると、完全なユニットテストです.ユニットテストに合格すれば、私たちがテストしたこの関数が正常に動作することを示します.ユニットテストに合格しない場合は、関数にバグがあるか、テスト条件の入力が正しくないか、つまり、ユニットテストに合格できるように修復する必要があります.ユニットテストに合格した後、何の意味がありますか?もし私たちが
プログラムの実行中に、いろいろなエラーが発生します.整数を出力すべき結果が文字列を出力するなど、プログラムの作成に問題があるエラーがあります.このエラーは通常バグと呼ばれ、バグは修復しなければなりません.あるエラーはユーザ入力によるものであり、例えばユーザにemailアドレスを入力させた結果、空の文字列が得られ、このエラーはユーザ入力をチェックすることによって対応する処理を行うことができる.
もう1つのエラーは、ファイルを書き込むときにディスクがいっぱいになったり、書けなくなったり、ネットワークからデータをキャプチャしたりして、ネットワークが突然切れたりするなど、プログラムの実行中に予測できないものです.このようなエラーは例外とも呼ばれ、プログラムでは通常処理しなければならない.そうしないと、プログラムは様々な問題で終了し、終了する.
Pythonには異常処理メカニズムが内蔵されており、エラー処理を支援しています.
また、プログラムの実行を追跡し、変数の値が正しいかどうかを確認する必要があります.このプロセスはデバッグと呼ばれ、Pythonのpdbはコードを単一ステップで実行することができます.
最後に、作成テストも重要で、良好なテストがあれば、プログラムの修正後に繰り返し実行することができ、プログラムが私たちが作成したテストに合致することを確保することができる.
異常とは?
異常とは、プログラムの実行中にエラーが発生した信号(プログラムにエラーが発生した場合、例外が発生し、プログラムが処理されていない場合、その異常が投げ出され、プログラムの実行も終了する)であり、pythonでエラーが発生した異常は以下の通りである.エラーは2つに分けられる.
1.構文エラー(pythonインタプリタの構文検出に耐えられず、プログラム実行前に修正しなければならない)
#
if
#
def test:
pass
#
class Foo
pass
#
print(haha)
2.論理エラー
#TypeError:int
for i in 3:
pass
#ValueError
num=input(">>: ") # hello
int(num)
#NameError
aaa
#IndexError
l=['egon','aa']
l[3]
#KeyError
dic={'name':'egon'}
dic['age']
#AttributeError
class Foo:pass
Foo.x
#ZeroDivisionError:
res1=1/0
res2=1+'str'
# :
1.
2.
3.
:
try:
#
except as :
#
else:
#
finally:
#
#
raise (' ')
#
class MyError(BaseException):
def __init__(self,msg):
self.msg = msg
# :
# assert
異常の種類
Pythonにおける異なる異常は、異なるタイプ(Pythonにおいてクラスとタイプ、すなわちクラスが統一されている)で識別することができ、1つの異常は1つのエラーを識別することができる.
よくある例外
例外名
説明
AttributeError
オブジェクトにないツリーにアクセスしようとします.fooなどです.xですがfooには属性xがありません
IOError
入出力異常;基本的にファイルを開けません
ImportError
モジュールまたはパッケージを導入できません.基本的にはパスの問題または名前のエラーです
IndentationError
構文エラー(のサブクラス);コードが正しく整列していません
IndexError
下付きインデックスはシーケンス境界を超えており、例えばxが3つの要素しかないのにxにアクセスしようとしている[5]
KeyError
辞書に存在しないキーにアクセスしようとする
KeyboardInterrupt
Ctrl+Cが押される
NameError
オブジェクトがまだ与えられていない変数を使用
SyntaxError
Pythonコードは不正で、コードはコンパイルできません(個人的には文法が間違っていると思っていますが、書き間違えました)
TypeError
受信オブジェクトタイプと要件の不一致
UnboundLocalError
まだ設定されていないローカル変数にアクセスしようとしますが、基本的には同じ名前のグローバル変数があるため、アクセスしていると思っています.
ValueError
値のタイプが正しい場合でも、呼び出し元が望ましくない値を入力します.
その他の例外
例外名
説明
BaseException
すべての例外のベースクラス
SystemExit
インタプリタ要求終了
KeyboardInterrupt
ユーザ割り込み実行(通常は入力^C)
Exception
一般的なエラーのベースクラス
StopIteration
反復器にはこれ以上の値はありません
GeneratorExit
ジェネレータに異常が発生し、終了を通知
StandardError
すべての組み込み標準異常のベースクラス
ArithmeticError
すべての数値計算エラーのベースクラス
FloatingPointError
浮動小数点計算エラー
OverflowError
最大限度を超える数値演算
ZeroDivisionError
ゼロを除く(または型を取る)(すべてのデータ型)
AssertionError
アサーション文が失敗しました
AttributeError
オブジェクトにはこの属性がありません
EOFError
組み込み入力なしでEOFタグに到達
EnvironmentError
OSエラーのベースクラス
IOError
入出力操作に失敗しました
OSError
OSエラー
WindowsError
システム呼び出しに失敗しました
ImportError
モジュール/オブジェクトのインポートに失敗しました
LookupError
無効なデータ・クエリーのベース・クラス
IndexError
シーケンスにこのインデックスはありません(index)
KeyError
マッピングにこのキーはありません
MemoryError
メモリオーバーフローエラー(Pythonインタプリタでは致命的ではありません)
NameError
オブジェクトが宣言/初期化されていません(属性なし)
UnboundLocalError
初期化されていないローカル変数へのアクセス
ReferenceError
弱参照(Weak reference)は、ゴミ回収されたオブジェクトにアクセスしようとします.
RuntimeError
一般的なランタイムエラー
NotImplementedError
まだ実現されていない方法
SyntaxError
Python構文エラー
IndentationError
インデントエラー
TabError
Tabとスペースの混在
SystemError
一般的な解釈システムエラー
TypeError
タイプに無効なアクション
ValueError
無効なパラメータが入力されました
UnicodeError
Unicode関連エラー
UnicodeDecodeError
Unicode復号時のエラー
UnicodeEncodeError
Unicode符号化時エラー
UnicodeTranslateError
Unicode変換時エラー
Warning
警告ベースクラス
DeprecationWarning
廃棄されたフィーチャーに関する警告
FutureWarning
将来的に意味が変わるという警告について
OverflowWarning
古いオートリフト長型(long)に関する警告
PendingDeprecationWarning
特性が廃棄される警告について
RuntimeWarning
不審なランタイム挙動(runtime behavior)の警告
SyntaxWarning
不審な文法の警告
UserWarning
ユーザーコード生成の警告
例外処理
プログラムの頑丈性とフォールトトレランス性を保証するために、すなわち、エラーが発生したときにプログラムがクラッシュしないように、異常を処理する必要がある.エラーが発生する条件が予知可能である場合、ifで処理する必要がある:エラーが発生する前に予防する.
AGE = 10
while True:
age=input('>>: ').strip()
if age.isdigit(): # age , ,
age=int(age)
if age == AGE:
print('you get it')
break
誤って発生した条約が予知できない場合、使用するtry...Except:エラー発生後の処理
# :
try:
except :
try ,
# Example1
try:
f=open('a.txt')
g=(line.strip() for line in f)
print(next(g))
print(next(g))
print(next(g))
except StopIteration:
f.close()
,
s1 = 'hello'
try:
int(s1)
except IndexError as e: # ,
print e
マルチブランチ
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
万能異常Exception
s1 = 'hello'
try:
int(s1)
except Exception as e:
print(e)
マルチブランチ異常と万能異常
もしあなたが望む効果は、どんな異常が発生しても、私たちは統一的に捨てたり、同じコードロジックを使って彼らを処理したりすることです.では、騒年、大胆にやりましょう.Exceptionがあれば十分です.もしあなたが望む効果は、異なる異常に対して異なる処理ロジックをカスタマイズする必要があるなら、マルチブランチを使用する必要があります.
マルチブランチ後のException
s1 = 'hello'
try:
int(s1)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
except Exception as e:
print(e)
異常なその他の機構
try-finally文は、例外が発生するかどうかにかかわらず、最後のコードを実行します.
s1 = 'hello'
try:
int(s1)
except IndexError as a:
print(e)
except KeyError as e:
print(e)
except ValueError as e:
print(e)
# except Exception as e:
# print(e)
else:
print('try ')
finally:
print(' , , ')
アクティブトリガ異常
try:
raise TypeError(' ')
except Exception as e:
print(e)
カスタム例外
class EgonException(BaseException):
def __init__(self,msg):
self.msg=msg
def __str__(self):
return self.msg
try:
raise EgonException(' ')
except EgonException as e:
va1 = traceback.format_exc() #
print(e)
print(va1)
アサーション:assert条件
assert 1 == 1
assert 1 == 2
まとめるtry.except
#
# , ,
# , , .
いつ異常処理
ある学友会はこのように思って、异常な処理を学んだ后に、とても强大で、私は私のすべてのプログラムのためにtryをプラスします...except、干毛糸はそれが论理の间违いがあるかどうかを考えて、このようにとても良くて、多く脳の细胞===を省きます
まずtry...exceptはあなたが添付したプログラムの異常処理の論理で、あなたの主な仕事とは関係ありません.このようなものが多くなると、コードの可読性が悪くなります.
そして異常処理本はあなたの2 b論理のお尻拭き紙ではなく、エラーが発生した条件が予知できない場合にのみtry...exceptを加えるべきです.
レコードエラー
エラーをキャプチャしなければ、Python解釈器にエラースタックを印刷させることは自然にできるが、プログラムも終了し、エラースタックを印刷することができ、エラーの原因を分析し、プログラムを実行し続けることができる.Pythonに内蔵logginモジュールは、エラー情報を非常に容易に記録することができる.
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except Exception as e:
logging.exception(e)
main()
print('END')
# , , .
# ,logging , .
ユニットテスト
「テスト駆動開発」を聞いたことがあるなら、ユニットテストはよく知られていません.ユニットテストは、モジュール、関数、またはクラスに対して正確性検査を行うためのテスト作業である.たとえば、関数abs()では、次のいくつかのテスト例を記述できます.
上のテスト例をテストモジュールに入れると、完全なユニットテストです.ユニットテストに合格すれば、私たちがテストしたこの関数が正常に動作することを示します.ユニットテストに合格しない場合は、関数にバグがあるか、テスト条件の入力が正しくないか、つまり、ユニットテストに合格できるように修復する必要があります.ユニットテストに合格した後、何の意味がありますか?もし私たちが
abs()
関数コードを修正したら、もう一度ユニットテストを実行するだけで、もし合格すれば、私たちの修正はabs()
関数の元の行為に影響を与えないことを説明して、もしテストが合格しなければ、私たちの修正は元の行為と一致しないことを説明して、あるいはコードを修正して、あるいはテストを修正します.このようなテストを駆動する開発モデルの最大の利点は、プログラムモジュールの動作が私たちが設計したテスト例に合致することを確保することです.将来の修正では、モジュールの動作が依然として正しいことを極めて保証することができる.Dict
クラスを作成します.このクラスの動作はdict
と一致していますが、プロパティでアクセスできます.以下のように使用します.