Как записать ошибку в файл, и не вызвать ошибку при исключении - PullRequest
19 голосов
/ 02 августа 2010

Я загружаю файл из сети, и он не работает, хотя я делаю:

для p в запросе:

try:

except IOError as e:
   print e;

Если есть ошибка, я хочу зарегистрировать ее, а затем продолжить со следующим файлом.

В этом цикле я пытаюсь загрузить изображение, если по какой-то причине неправильное имя файла или веб-сайт не работает и т. Д., Я хочу перейти к следующему элементу цикла for.

Существует ли более общая ошибка, которая не приведет к сбою и продолжит обработку?

Кроме того, как я могу записывать ошибки в файл?

Ответы [ 4 ]

18 голосов
/ 02 августа 2010

Вы можете использовать модуль регистрации :

import logging
logging.basicConfig(filename='/tmp/myapp.log', level=logging.DEBUG, 
                    format='%(asctime)s %(levelname)s %(name)s %(message)s')
logger=logging.getLogger(__name__)

try:
    1/0
except ZeroDivisionError as err:
    logger.error(err)

Запуск скрипта пишет в /tmp/myapp.log:

% cat /tmp/myapp.log 
2010-08-01 17:50:45,960 ERROR __main__ integer division or modulo by zero
14 голосов
/ 02 августа 2010

Как указал Лотт, если загрузка не удалась, если проблема не устранена в апстриме (или с вашим адресом загрузки), лучшее, что вы можете сделать, это попробовать еще раз.Однако, если ситуация такова, что у вас есть список загрузок, и вы просто хотите пропустить неудачные загрузки вместо выхода, то:

logf = open("download.log", "w")
for download in download_list:
    try:
        # code to process download here
    except Exception as e:     # most generic exception you can catch
        logf.write("Failed to download {0}: {1}\n".format(str(download), str(e)))
        # optional: delete local version of failed download
    finally:
        # optional clean up code
        pass

На заметку:

(1)Использование модуля "logging", как предлагает ~ unutbu, дает вам гораздо большую гибкость и мощность при выводе журнала, включая отметку времени, одновременную запись в разные каналы (например, stderr, файл) в зависимости от уровней ошибок и т. Д.и т. д.

(2) Вы можете рассмотреть возможность реализации вышеуказанной логики с использованием конструкции "with".

4 голосов
/ 24 октября 2017

Это запишет вашу ошибку в файл журнала и продолжит выполнение кода.

import traceback

#This line opens a log file
log = open("log.txt", "w")

try:
    # some code
    # Below line will print any print to log file as well.
    print("Creating DB Connection", file = log)
except Exception:
    traceback.print_exc(file=log)
    continue
3 голосов
/ 02 августа 2010

Это ловит все. Но гораздо лучше поймать точное исключение. питон <= 2.7 </p>

while True:
  try:
    doStuff()
  except Exception, e:
    f = open('log.txt', 'w')
    f.write('An exceptional thing happed - %s' % e)
    f.close()
...