Вы, вероятно, хотите сделать, как 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 vs. 3.x (см. Модуль traceback
для большей части того, что вам нужно знать), но вот пример 3.x, который дает вам именно то, что вы просили:
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))
+1. Но почему у вас есть блок 'else'? Нет никакого способа вернуть результат. – abarnert