2016-01-21 35 views
1

我有一个地址解析地址的函数。我不想让这个函数死掉,所以我试图捕获错误并返回一个元组。 但是我也想区分错误,为此我使用try /除了在多个地方。python函数中有多少try/except是太多

是否有太多的尝试/除了这样的事情?你会如何优化这个功能?

这里是我的代码:

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') 

也返回元组来指示错误通常不是首选。考虑把除了在调用函数中的try,并让错误传播起来。

+0

哦,这是有道理的。所以我会尝试使用except来捕捉错误的类型。这将允许我有不同的错误信息并减少尝试次数。谢谢。 – LZAntal