2010-12-16 72 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