おそらく unutbu が示唆するようにしたいと思うでしょう。なぜなら、それはより柔軟で、最終的には同じくらい単純だからです. しかし、 の追加の詳細に圧倒された場合は、次logging
のようにして、まさにあなたが要求したことを行う方法を示します。
def exception_catch(log_path):
def deco(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
with open(log_path, 'a') as log:
log.write('{} {} {} {} {}\n'.format(datetime.datetime.now(),
type(e), e, args, kwargs))
# This will return None on error, of course
return wrapper
return deco
format
もちろん、上記のスコープのローカル変数を含め、必要なものを に入れることができます。あなたが求めたものの唯一のトリッキーなビットは、「コード内の例外行」です。その詳細は 2.x と 3.x では少し異なります (traceback
知っておくべきことのほとんどについては、モジュールを参照してください)。
except Exception as e:
filename, line, func, text = traceback.extract_stack(limit=1)[0]
with open(log_path, 'a') as log:
log.write('time: {} type: {} line: {} args: {}\n'.format(
datetime.datetime.now(),
type(e),
line,
args))