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

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

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

try:

except IOError as e:
   print e;

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

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

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

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

Ответ 1

Как указано 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, file) в зависимости от уровня ошибок и т.д. и т.д.

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

Ответ 2

Вы можете использовать logging module:

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)

Запуск script записи в /tmp/myapp.log:

% cat /tmp/myapp.log 
2010-08-01 17:50:45,960 ERROR __main__ integer division or modulo by zero

Ответ 3

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

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

Ответ 4

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

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