Я использую python декоратор для обработки исключений в моем приложении flask.
decorators.py
def exception(original_function=None, message='Some error occurred on our end.', app=None):
def decorator(function):
@functools.wraps(function)
def wrapper_function(*args, **kwargs):
try:
return function(*args, **kwargs)
except Exception as e:
handler(app, e)
return internal_error(message)
return wrapper_function
handler
Функция захватывает детали исключений и регистрирует или отображает их.
def handler(app, e='Exception'):
exc_type, exc_obj, exc_tb = sys.exc_info()
exc_type, filename, line_no = exc_type, exc_tb.tb_frame.f_code.co_filename, exc_tb.tb_lineno
app.logger.error(f'\n+{"-" * 64}\n'
'| Exception details:\n'
f'| Message: {e}\n'
f'| Type:\t\t{exc_type}\n'
f'| File:\t\t{filename}\n'
f'| Line No:\t\t{line_no}\n'
f'+{"-" * 64}\n')
Затем я использую его в flask маршрутах как:
route.py
@bp.route('/initialize/<string:uuid>/<string:method>', methods=['POST'])
@exception(app=current_app)
def initialize(uuid=None, method=None):
if not uuid:
return bad_request('No UUID')
В данный момент обработчик работает, однако он регистрирует, что исключение возникло из decorators.py в строке return function(*args, **kwargs)
. Как мне зарегистрировать фактический файл и вывести строку, в которой возникло исключение?
Вот вывод журнала.
+----------------------------------------------------------------
| Exception details:
| Message: Required PAYPAL_CLIENT_ID and PAYPAL_CLIENT_SECRET.
| Type: <class 'paypalrestsdk.exceptions.MissingConfig'>
| File: /app/decorators.py
| Line No: 16
+----------------------------------------------------------------