Ich habe normalerweise eine harte Zeit nagelnd, wie man urllib2 Ausnahmen behandelt. Also lerne ich immer noch. Hier ist ein Szenario, zu dem ich gerne Ratschläge hätte.urllib2 Ausnahmebehandlung mit couchdb
Ich habe eine lokale Couch Datenbank. Ich möchte wissen, ob die Datenbank existiert. zB "127.0.0.1:5984/database". Wenn es nicht existiert und ich "127.0.0.1:5984" erreichen kann, möchte ich wissen, dass ich die neue Datenbank erstellen kann.
Hier sind mehrere Fälle Ich denke an:
1) ich ein Timeout bekommen konnte.
2) meine URL ist in dem Sinne falsch, dass ich nicht die Datenbank vollständig, dh erreichen tippte ich 127.0.4.1:5984/database aber couchdb ist auf 127.0.0.1:5984
3) der Datenbankpfad " Datenbank "existiert nicht auf der Couch-Datenbank.
einige Code So, hier habe ich es zu handhaben:
Was ich tue, ist die Reaktion testen. Wenn alles in Ordnung ist, setze ich db_exists auf True. Die einzige Zeit, die ich db_exists auf False setze, ist, wenn ich einen 404 bekomme. Alles andere beendet das Programm.
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
Ich verfolge die Ausnahmebehandlung Schema in URLlib2 The Missing Manual verlegt werden.
Also im Grunde ist meine Fragen ...
1) Ist die eine saubere, robuste Art und Weise zu handhaben?
2) ist es gängige Praxis, sys.exit() im gesamten Code zu streuen.
-Update- Mit 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)
Danke für den Rat. Ich habe den Beitrag mit einer Couchdb-Python-Version aktualisiert. Die Idee ist, wenn der Versuch erfolgreich ist, dann existiert die Datenbank. Ist die Ausnahmebehandlung hier sinnvoller? – sbartell