2010-12-16 22 views
2

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) 

Antwort

1

Ich würde behaupten, dass dieses Problem bei einem zu niedrigem Niveau ist angreifen. Warum nicht couchdb-python verwenden?

Um Ihre Fragen zu beantworten, 1) Nein, es ist keine besonders saubere Möglichkeit, dies zu tun. Ich würde zumindest den Code in Ihrer Blockierung in eine Methode einteilen, die für Ihre Anwendung geeignete Fehlertypen aus dem urrlib2.URLError extrahiert. Für 2), nein, es ist schlechte Übung, sys.exit() fast immer aufzurufen. Eine geeignete Ausnahme auslösen. Standardmäßig wird dies wie eine sys.exit(), aber mit einer Traceback-Funktion angezeigt. Da Ihr Couch-Client eine Bibliothek ist, können die Ausnahmen nach Ermessen der Anwendung gehandhabt werden. Der Bibliothekscode sollte den Interpreter niemals verlassen.

+0

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