2016-01-21 6 views
1

У меня есть функция, которая геокодирует адрес. Я не хочу, чтобы эта функция умирала, поэтому я пытаюсь поймать ошибку и вместо нее вернусь. Однако я также хочу различать ошибки, для этого я использую try/except в нескольких местах.Сколько попыток/исключений слишком много в функции python

Есть ли такая вещь, как слишком много попыток/кроме? Как бы вы оптимизировали эту функцию?

Вот мой код:

def geocode(address): 
    js = '' 
    try: 
     urlq = urllib.urlencode({'address':address, 'sensor':'false'}) 
    except Exception, e: 
     return (False, "Error url-encoding address. Error:%s" % e, js, 'failed') 
    try: 
     f = urllib2.urlopen(GEO_URL + urlq) 
     d = f.read() 
    except Exception, e: 
     return (False, "Error making connection. Error:%s" % e, js, 'failed') 
    # 
    try: 
     js = json.loads(d) 
    except Exception, e: 
     return (False, "Error converting JSON. Error:%s" % e, js, 'failed') 
    return (True, '', js, 'ok') 
+3

«Я не хочу, чтобы эта функция умирала, поэтому я пытаюсь поймать ошибку и вернуть кортеж вместо этого» - не бойтесь допускать исключения. Это часто правильный ход действий. – user2357112

+0

@ user2357112 вы правы, но в этом случае я боюсь :), потому что он работает от задания cron, и я не хочу, чтобы он остановился от плохого адреса. Поэтому я просто регистрирую ответ, если он не прошел. – LZAntal

ответ

4

Ловля Exception всегда плохая идея. Вы хотите указать, какую ошибку вы хотите поймать.

try: 
    ... 
except URLError, e: 
    return (False, "Error making connection. Error:%s" % e, js, 'failed') 
except ValueError, e: 
    return (False, "Error converting JSON. Error:%s" % e, js, 'failed') 
except UnicodeEncodeError, e: 
    return (False, "Error unicode formatting. Error:%s" % e, js, 'failed') 

Также возвращающий кортеж для указания ошибки, как правило, не является предпочтительным. Подумайте о том, чтобы положить попытку, кроме как в вызывающую функцию, и позволить распространению ошибки.

+0

О, это имеет смысл. Поэтому я бы попробовал и использовал исключение, чтобы поймать тип ошибки. Это позволит мне иметь разные сообщения об ошибках и уменьшить количество попыток. Благодарю. – LZAntal

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