は、私は別のファイルmy_file.py
では、私のファイルdecorators.py
Python例外が発生した場所の実際の行番号を取得する方法は?
def catch_exceptions(function): #Line #1
@wraps(function) #Line #2
def decorator(*args, **kwargs): #Line #3
try: #Line #4
return function(*args, **kwargs) #Line #5
except Exception as e: #Line #6
exc_type, exc_obj, exc_tb = sys.exc_info() #Line #7
fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1] #Line #8
print "E=%s, F=%s, L=%s" % (str(e), fname, exc_tb.tb_lineno) #Line #9
return decorator #Line #10
で、次のPythonのデコレータを持って、私はこのようなcatch_exceptions
デコレータを使用します。
from decorators import catch_exceptions #Line #1
@catch_exceptions #Line #2
def my_method() #Line #3
print (10/0 - 5/0) #Line #4
私はそれを実行すると、私は次のような出力が得られます。
E=integer division or modulo by zero, F=decorators.py, L=5
例外ロケーションとしてdecorators.py
、行番号5、実際に例外が発生した場所の実際のファイルと行番号を報告するにはどうすればよいですか?それはmy_file.py
の4行目です。
はい。これは動作します! FYIでは、traceback.extract_tb(exc_tb)リストの最後の要素を選択する方がさらに優れています。このデコレータは、メソッドに関連付けられたデコレータのスタックのどこにでも表示されます。私はそれに応じてあなたの答えに編集を掲載しました。 –
@SaqibAli yeap、それはいいです、ありがとう、私はあなたの編集を承認しましたが、_last_、_second_、_first_のような言葉も同様に処理する必要があります。それが助けてくれてうれしい! –