2015-01-13 2 views
11

Я использую геофизику для геокодирования некоторых адресов, и я хочу поймать ошибки таймаута и распечатать их, чтобы я мог выполнить некоторый контроль качества на входе. Я помещаю запрос геокода в try/catch, но он не работает. Любые идеи о том, что мне нужно делать?Geopy: ошибка тайм-аута ловушки

Вот мой код:

try: 
    location = geolocator.geocode(my_address)    
except ValueError as error_message: 
    print("Error: geocode failed on input %s with message %s"%(a, error_message)) 

я получаю следующее исключение:

File "/usr/local/lib/python2.7/site-packages/geopy/geocoders/base.py", line 158, in _call_geocoder 
    raise GeocoderTimedOut('Service timed out') 
    geopy.exc.GeocoderTimedOut: Service timed out 

Спасибо заранее!

+1

Вы попадаете в неправильное исключение; Исключением, которое вам нужно поймать, является 'GeocoderTimedOut'. –

ответ

15

Попробуйте это:

from geopy.geocoders import Nominatim 
from geopy.exc import GeocoderTimedOut 

my_address = '1600 Pennsylvania Avenue NW Washington, DC 20500' 

geolocator = Nominatim() 
try: 
    location = geolocator.geocode(my_address) 
    print location.latitude, location.longitude 
except GeocoderTimedOut as e: 
    print("Error: geocode failed on input %s with message %s"%(my_address, e.msg)) 

Вы можете также рассмотреть вопрос об увеличении времени ожидания на Геокодировать звонок Вы делаете на свой Geolocator. В моем примере это будет что-то вроде:

location = geolocator.geocode(my_address, timeout=10) 

или

location = geolocator.geocode(my_address, timeout=None) 
+2

Просто примечание, сообщение внутри 'e' в ошибке GeocoderTimedOut похоже теперь' .message' вместо '.msg' –

+0

.msg не работает –

1

Вы можете испытывать эту проблему, потому что вы пытались запросить этот адрес несколько раз, и они временно заблокировал вас или замедлить вас вниз из-за их usage policy. В нем больше нет запросов, чем один раз в секунду, и что вы должны кэшировать свои результаты. Я столкнулся с этой проблемой, и у вас есть несколько решений. Если вы не хотите сильно менять свой код, вы можете получить ключ API Google, который можно использовать для чего-то вроде 2500 запросов/дней бесплатно, или вы можете кэшировать свои результаты. Поскольку я уже использовал DynamoDB на AWS для своей проблемы, я пошел дальше и только создал таблицу, в которой храню свои результаты. Here is the gist of my code.

Смежные вопросы