2016-10-25 4 views
2

Эта функция должна ловить исключения в основном выполнении. Если есть исключение, он должен распечатать ошибку с log.error(traceback.print_exc()) и очистить с помощью exit_main().Python traceback.print_exc() возвращает 'None'

def main(): 
    try: 
     exec_app() 
    except KeyboardInterrupt: 
     log.error('Error: Backup aborted by user.') 
     exit_main() 
    except Exception: 
     log.error('Error: An Exception was thrown.') 
     log.error("-" * 60) 
     log.error(traceback.print_exc()) 
     log.error("-" * 60) 
     exit_main() 

К сожалению log.error(traceback.print_exc()) делает возвращение None только если есть исключение. Как я могу сделать трассировку распечатать полный отчет об ошибке в этом случае?

PS: Я использую python 3.4.

+0

Какое исключение вы ожидаете зайти в журнал с помощью traceback.print_exc() '? он будет записывать все исключения, кроме 'KeyboardInterrupt' – ettanany

+0

Да. Он должен обрабатывать все исключения, которые я не обнаружил внутри 'exec_app()'. – Rotareti

ответ

5

От его __doc__:

Shorthand for 'print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file)' 

То есть, он не должен ничего возвращать, его работа состоит в том, чтобы напечатать. Если вы хотите, чтобы трассировка была записана в виде строки, используйте вместо этого traceback.format_exc().

1

Обычно я использую traceback.print_exc() только для отладки. В вашем случае, чтобы зарегистрировать свое исключение, вы можете просто сделать следующее:

try: 
    # Your code that might raise exceptions 
except SomeSpecificException as e: 
    # Do something (log the exception, rollback, etc) 
except Exception as e: 
    log.error(e) # or log(e.message) if you want to log only the message and not all the error stack 
Смежные вопросы