使用urllib2处理CouchDB的异常
我通常很难搞清楚怎么处理urllib2的异常,所以我还在学习。这里有一个场景,我想请教一下意见。
我有一个本地的CouchDB数据库。我想知道这个数据库是否存在,也就是说“127.0.0.1:5984/database”。如果它不存在,但我能访问“127.0.0.1:5984”,我想知道这样我就可以创建一个新的数据库。
我考虑了几个情况:
1) 我可能会遇到超时。
2) 我的URL写错了,比如我输入的是127.0.4.1:5984/database,但CouchDB实际上是在127.0.0.1:5984。
3) 数据库路径“database”在CouchDB中不存在。
所以我写了一些代码来处理这些情况:
我会测试响应。如果一切正常,我就把db_exists设置为True。只有在收到404错误时,我才会把db_exists设置为False。其他情况我就直接退出程序。
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)
1 个回答
我觉得你可能是从一个太基础的层面来解决这个问题。为什么不试试 couchdb-python 呢?
来回答你的问题,1) 这样做并不是特别干净。我建议你把异常处理部分的代码提取到一个方法里,这个方法可以从 urllib2.URLError 中提取出适合你应用的错误类型。至于问题2),几乎总是调用 sys.exit() 是不好的做法。应该抛出一个合适的异常。默认情况下,这个异常会向上冒泡并停止解释器,就像你的 sys.exit() 一样,不过会带有错误追踪信息。而且,因为你的 Couch 客户端是一个库,异常可以由应用程序自行处理。库代码不应该直接退出解释器。