Search code examples
pythonexceptionloggingpython-logging

How to log error to file, and not fail on exception


I am downloading a file from the net, and it fails even though I am doing:

for p in query:

    try:
    
    except IOError as e:
       print e;

If there is an error, I want to log it, and then continue on with the next file.

In this loop, I am trying to download an image, if for some reason the filename was bad, or the website was down, etc., I want to continue with the next item in the for loop.

Is there a more generic error that won't fail and continue processing?

Also, how can I log errors to a file?


Solution

  • As pointed out by Lott, if a download is failing, unless the problem is fixed upstream (or with your download address), the best you can do is to try again. However, if the situation is that you have a list of downloads, and simply want to skip over failed downloads instead of exiting, then:

    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
    

    Things to note:

    (1) Use of the "logging" module, as suggested by ~unutbu, gives you much more flexibility and power with your logging output, including time stamp, simultaneously writing to different channels (e.g., stderr, file) depending on error levels, etc. etc.

    (2) You might consider implementing the above logic using the "with" construct.