Как зарегистрировать ошибку зарегистрировать и не перестать работать на исключении

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

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

try:

except IOError as e:
   print e;

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

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

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

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

21
задан 0m3r 12 June 2019 в 20:44
поделиться

3 ответа

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

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".

15
ответ дан 29 November 2019 в 20:20
поделиться

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

while True:
  try:
    doStuff()
  except Exception, e:
    f = open('log.txt', 'w')
    f.write('An exceptional thing happed - %s' % e)
    f.close()
3
ответ дан 29 November 2019 в 20:20
поделиться

Можно использовать модуль логирования:

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
20
ответ дан 29 November 2019 в 20:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: