简体   繁体   中英

Geopy with error handling

I have some Python code with error handling in place but for some reason the code still seems to be unable to handle this particular error:

raise GQueryError("No corresponding geographic location could be found for the     specified location, possibly because the address is relatively new, or because it may be incorrect.")
geopy.geocoders.google.GQueryError: No corresponding geographic location could be found for the specified location, possibly because the address is relatively new, or because it may be incorrect.

This is the source:

import csv
from geopy import geocoders
import time

g = geocoders.Google()

spamReader = csv.reader(open('locations.csv', 'rb'), delimiter='\t', quotechar='|')

f = open("output.txt",'w')

for row in spamReader:
    a = ', '.join(row)
    #exactly_one = False
    time.sleep(1)

    try:
        place, (lat, lng) = g.geocode(a)
    except ValueError:
        #print("Error: geocode failed on input %s with message %s"%(a, error_message))
        continue 

    b = str(place) + "," + str(lat) + "," + str(lng) + "\n"
    print b
    f.write(b)

Have I not included enough error handling? I was under the impression that "except ValueError" would handle this situation but I must be wrong on that.

Thanks in advance for any help out!

PS I pulled this out of the code but I don't know what it really means yet:

   def check_status_code(self,status_code):
    if status_code == 400:
        raise GeocoderResultError("Bad request (Server returned status 400)")
    elif status_code == 500:
        raise GeocoderResultError("Unkown error (Server returned status 500)")
    elif status_code == 601:
        raise GQueryError("An empty lookup was performed")
    elif status_code == 602:
        raise GQueryError("No corresponding geographic location could be found for the specified location, possibly because the address is relatively new, or because it may be incorrect.")
    elif status_code == 603:
        raise GQueryError("The geocode for the given location could be returned due to legal or contractual reasons")
    elif status_code == 610:
        raise GBadKeyError("The api_key is either invalid or does not match the domain for which it was given.")
    elif status_code == 620:
        raise GTooManyQueriesError("The given key has gone over the requests limit in the 24 hour period or has submitted too many requests in too short a period of time.")

Right now the try/except is only catching ValueError s. To catch GQueryError as well, replace the except ValueError: line with:

except (ValueError, GQueryError):

Or if GQueryError isn't in your namespace, you may need something like this:

except (ValueError, geocoders.google.GQueryError):

Or to catch ValueError and all the errors listed in check_status_code :

except (ValueError, GQueryError, GeocoderResultError, 
        GBadKeyError, GTooManyQueriesError):

(Again, add geocoders.google. or whatever the error location is to the front of all the geopy errors if they're not in your namespace.)

Or, if you just want to catch all possible exceptions, you could simply do:

except:

but this is generally bad practice, because it'll also catch things like a syntax error in your place, (lat, lng) = g.geocode(a) line, which you don't want caught, so it's better to examine the geopy code to find all the possible exceptions it could be throwing that you want to catch. Hopefully all of those are listed in that bit of code you found.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM