Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 2, 2016 17:13:52

Pavel_Blend
Зарегистрирован: 2014-10-29
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать сообщение об ошибке в файл

Здравствуйте. У меня в модуле есть, например, такой код:

 def main_loop():
    try:
        test()
        a = 1 / 0
    except BaseException as error:
        file = open('test_log_file.txt', 'w')
        file.write(str(error))
        file.close()

В итоге строка a = 1 / 0 вызовет ошибку и в файл “test_log_file.txt” запишется “division by zero”.
Я использую исключение BaseException вместо ZeroDivisionError, чтобы обработать все
виды ошибок, которые гипотетически могут возникнуть в функции test.
Вопрос: как записать в файл полное сообщение об ошибке вместе со стеком вызовов?
Наподобие этого:
 File "C:\Users\Admin\Desktop\test_module.py", line 9, in <module>
    main_loop()
File "C:\Users\Admin\Desktop\test_module.py", line 7, in main_loop
    a = 1 / 0
ZeroDivisionError: division by zero

Офлайн

#2 Окт. 2, 2016 17:43:44

vic57
Зарегистрирован: 2015-07-07
Сообщения: 913
Репутация: +  127  -
Профиль  

Как записать сообщение об ошибке в файл

если Unix-like то перенаправить поток ошибок

python myscript.py 2>mylog.txt
В win может тоже пойдет

Отредактировано vic57 (Окт. 2, 2016 17:49:13)

Офлайн

#3 Окт. 2, 2016 18:40:34

Pavel_Blend
Зарегистрирован: 2014-10-29
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать сообщение об ошибке в файл

А другого способа нет? Я просто этот скрипт запускаю из игрового движка. И не хочется запускать игру с помощью bat-ника (game.exe > test_log_file.txt). И плюс к тому, путь к файлу test_log_file.txt можно изменять в файле настроек. Он может быть разным время от времени.

Офлайн

#4 Окт. 2, 2016 18:43:36

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Как записать сообщение об ошибке в файл

модуль traceback этим занимается.
Если просто, то вот так:

 import traceback
try:
   1 / 0
except Exception:
    with open('errors.log', 'a') as f:
        f.write('{}\n'.format(traceback.format_exc())
Еще можно подключить модуль logging для ведения логирования разного уровня, если оно надо в проекте.
P.S. если хотите обработать все ошибки - то надо использовать Exception, а BaseException базовый класс, от него наследуются исключения, которые вы не хотите перехватывать (см. в офиц.документации иерархию классов исключений)



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#5 Окт. 2, 2016 19:12:34

Pavel_Blend
Зарегистрирован: 2014-10-29
Сообщения: 10
Репутация: +  0  -
Профиль   Отправить e-mail  

Как записать сообщение об ошибке в файл

JOHN_16, спасибо. Это то что мне нужно было.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version