情報メソッドを除くPython追跡

次の関数を見てください

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

情報メソッドを除くPython追跡
Pythonオブジェクト指向の魔法の方法
Python3.7デバッグサンプルメソッド
Python関数-辞書get()メソッド
Pythonエラー処理方法
Pythonは関数メソッドを定義します
PythonTCPパケットインジェクション方式
Python描画リンググラフ法
Pythonは勾配降下法を実装しています
Pythonの右揃えの例の方法
パラメータを渡すPythonメソッド
Python算術シーケンス計算方法
pythonフォントを増やす方法の手順
Pythonの対数法の要約
Pythonとjsのインタラクティブな呼び出しメソッド
情報エントロピーの例のPython計算
Pythonは最も急な降下方法を実装します
pythonを実行するメソッドを終了します