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