我通常很难确定如何处理urllib2异常。所以我还在学习。这是一个我想要一些建议的场景。urllib2使用couchdb处理异常
我有一个本地沙发db数据库。我想知道数据库是否存在。即“127.0.0.1:5984/database”。如果它不存在,我可以达到“127.0.0.1:5984”,我想知道,所以我可以创建新的数据库。
下面是一些例子我在想:
1)我能得到一个超时。
2)我的网址是错在这个意义上,我无法达到数据库完全即我输入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()。
-Update- 使用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版本更新了这篇文章。这个想法是,如果尝试成功,那么数据库存在。这里的异常处理是否更有意义? – sbartell 2010-12-17 20:21:51