我通常很难确定如何处理 urllib2 异常。所以我还在学习。这是一个场景,我希望得到一些建议。
我有一个本地沙发数据库。我想知道数据库是否存在。即“127.0.0.1:5984/数据库”。如果它不存在,并且我可以到达“127.0.0.1:5984”,我想知道以便创建新数据库。
以下是我考虑的几个案例:
1) 我可以获得超时。
2) 我的 url 是错误的,因为我无法完全访问数据库,即我输入了 127.0.4.1:5984/database 但 couchdb 在 127.0.0.1:5984 上
3) 沙发数据库上不存在数据库路径“数据库”。
所以这里我写了一些代码来处理它:
我所做的是测试响应。如果一切正常,我将 db_exists 设置为 True。我将 db_exists 设置为 False 的唯一一次是收到 404。其他一切都会退出程序。
request = urllib2.Request(address)
try:
response = urllib2.urlopen(request)
except urllib2.URLError, e:
if hasattr(e, 'reason'):
print 'Failed to reach database'
print 'Reason: ', e.reason
sys.exit()
elif hasattr(e, 'code'):
if e.code == 404:
db_exists = False
else:
print 'Failed to reach database'
print 'Reason: ' + str(e)
sys.exit()
else:
try:
#I am expecting a json response. So make sure of it.
json.loads(response.read())
except:
print 'Failed to reach database at "' + address + '"'
sys.exit()
else:
db_exists = True
我正在遵循 URLlib2 The Missing Manual 中列出的异常处理方案.
所以基本上我的问题是......
1) 这是一种干净、可靠的处理方式吗?
2) 在整个代码中散布 sys.exit() 是一种常见的做法。
-更新- 使用 couchdb-python:
main(db_url):
database = couchdb.Database(url=db_url)
try:
database.info()
except couchdb.http.ResourceNotFound, err:
print '"' + db_url + '" ' + err.message[0] + ', ' + err.message[1]
return
except couchdb.http.Unauthorized, err:
print err.message[1]
return
except couchdb.http.ServerError, err:
print err.message
return
except socket.error, err:
print str(err)
return
if __name__ == '__main__':
# note that id did not show it here, but db_url comes from an arg.
main(db_url)
最佳答案
我认为您在太低的层面上解决了这个问题。为什么不使用 couchdb-python ?
要回答您的问题,1) 不,这不是一种特别干净的方法。我至少会将您的 except block 中的代码考虑到一个方法中,该方法从 urrlib2.URLError 中提取适合您的应用程序的错误类型。对于 2),不,几乎所有时间都调用 sys.exit() 是不好的做法。引发适当的异常。默认情况下,这将冒泡并停止解释器,就像您的 sys.exit() 但带有回溯。或者,由于您的 Couch 客户端是一个库,因此可以由应用程序自行决定处理异常。库代码不应该退出解释器。
关于python - 使用 couchdb 进行 urllib2 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4465231/