次の関数を見てください
def test():
sum =3/0if __name__ =='__main__':test()
0で割るのは間違いなく間違っています。ただし、内容は次のとおりです。
File “E:\Src\dongsheng\TestPython\testtrace_back.py”, line 23, in <module
test()
File “E:\Src\dongsheng\TestPython\testtrace_back.py”, line 19, in test
sum = 3/0
ZeroDivisionError: integer division or modulo by zero
上記のプロンプトは、IDEで実行すると表示されます。スクリプトが実際にオンラインで実行されると、通常はnohupモードで開始され、出力コンテンツはnohup.outファイルに書き込まれますが、このファイルのコンテンツは非常に多い場合があります。乱雑で、異常な調査を助長しません。
Pythonはトレースバックを提供します。これは、上記のコンテンツと同様に、例外が発生したときに情報を完全に出力し、指定されたファイルに入力できるため、監視が必要な関数が発生したときに変更するデコレータを作成することもできます。異常の場合は、異常に関する情報を記録してください。
# coding=utf-8from functools import wraps
import traceback
def except_trace(filename):
def decorate(func):
@ wraps(func)
def wrapper(*args,**kwargs):try:func(*args,**kwargs)
except:
fp =open(filename,'w')
traceback.print_exc(file=fp)
fp.close()return wrapper
return decorate
@ except_trace('1.txt')
def test():
sum =3/0if __name__ =='__main__':test()
今回は、例外が発生した後、例外に関する情報が1.txtファイルに入力されます。このファイルには、見やすいように例外情報のみが含まれています。
**追加知識:癖以外のPython **
私のお気に入りのPythonの癖を披露しましょう。このPythonコードで何をしたいですか?
別のプログラミング言語からPythonを学習している場合は、except句でネストされたスコープを導入することをお勧めします。そのため、句にeを割り当てても、すでに外部スコープにあるe変数には影響しません。ただし、Pythonでは、通常、制御構造はネストされたスコープを導入しません(リスト内包表記は例外です)。したがって、Pythonの経験が豊富な場合は、ZeroDivisionErrorのインスタンスを出力することを期待できます。
実際、標準のCPython実装では、何も出力しません。同時に、最後の行でNameErrorが発生します。これはバグですか?実際、これは意図的なものです。 exclude句によって生成されたバイトコードを見ると、次のことがわかります。
制御フローがexceptブロックを終了すると、Pythonはスコープから名前を削除します。どうして?例外は現在のスタックフレームへの参照を保持するため、スタックフレームにはスコープ内のすべてが含まれます。 Pythonは主に参照カウントによってメインメモリを管理するため、これは、次のガベージコレクションが実行されるまで(存在する場合)、現在のスコープ内の何も解放されないことを意味します。現在の動作は、メモリ使用量、実装の容易さ、およびクリーンな言語の間の妥協点です。いくつかの欠点がありますが、Pythonの好きなところを反映していると思います。純粋さが実用性を妨げないようにしてください。
ただし、これはDELETE_NAME命令についてのみ説明しています。変数が直後に削除された場合でも、CPythonがeをNoneに設定するのはなぜですか?さて、あなたとCPythonチームが同じ考えを持っていて、exceptブロックの最後で例外参照をクリーンアップすることにしたと想像してください。
例外ブロックの終わりで、CPythonはあなたが削除した名前eを削除しようとします!この問題を解決するために、CPythonはeを削除する前にe = Noneを割り当てて、eが存在することを確認します。
情報メソッドを除く上記のpythonトラッキングは、エディターによって共有されるすべてのコンテンツです。参照を提供したいと思います。
Recommended Posts