У меня обычно нелегко рушиться, как обращаться с исключениями urllib2. Поэтому я все еще учусь. Вот сценарий, на который мне хотелось бы посоветоваться.Обработка исключений с помощью urllib2 с couchdb
У меня есть база данных db локального дивана. Я хочу знать, существует ли база данных. т.е. "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) путь к базе данных " база данных "не существует на базе дивана.
Так вот некоторый код, я написал с ним обращаться:
Что я делаю, это проверить реакцию. Если все в порядке, я установил 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-питон:
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