2010-12-16 65 views
2

我通常很難確定如何處理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) 

回答

1

我認爲,你在過低的級別攻擊這一問題。爲什麼不使用couchdb-python

要回答你的問題,1)不,它不是一個特別乾淨的方式來做到這一點。我至少會將你的except代碼塊中的代碼放入一個方法中,該方法從urrlib2.URLError中提取適合於你的應用程序的錯誤類型。對於2),不是幾乎所有時間都調用sys.exit()是不好的做法。提出適當的例外。默認情況下,這會冒泡並停止解釋器,就像你的sys.exit()一樣,但是有一個回溯。或者,由於您的Couch客戶端是圖書館,因此應用程序可以自行決定是否處理例外情況。庫代碼不應該退出解釋器。

+0

感謝您的意見。我用couchdb-python版本更新了這篇文章。這個想法是,如果嘗試成功,那麼數據庫存在。這裏的異常處理是否更有意義? – sbartell 2010-12-17 20:21:51