python - 使用 couchdb 进行 urllib2 异常处理

标签 python exception couchdb urllib2

我通常很难确定如何处理 urllib2 异常。所以我还在学习。这是一个场景,我希望得到一些建议。

我有一个本地沙发数据库。我想知道数据库是否存在。即“127.0.0.1:5984/数据库”。如果它不存在,并且我可以到达“127.0.0.1:5984”,我想知道以便创建新数据库。

以下是我考虑的几个案例:

1) 我可以获得超时。

2) 我的 url 是错误的,因为我无法完全访问数据库,即我输入了 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() 是一种常见的做法。

-更新- 使用 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)

最佳答案

我认为您在太低的层面上解决了这个问题。为什么不使用 couchdb-python

要回答您的问题,1) 不,这不是一种特别干净的方法。我至少会将您的 except block 中的代码考虑到一个方法中,该方法从 urrlib2.URLError 中提取适合您的应用程序的错误类型。对于 2),不,几乎所有时间都调用 sys.exit() 是不好的做法。引发适当的异常。默认情况下,这将冒泡并停止解释器,就像您的 sys.exit() 但带有回溯。或者,由于您的 Couch 客户端是一个库,因此可以由应用程序自行决定处理异常。库代码不应该退出解释器。

关于python - 使用 couchdb 进行 urllib2 异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4465231/

相关文章:

java - 如何避免异常阴影?

couchdb - 发出的键可以在数组的开头有可选的数组参数吗?

python - Pandas - 计算每个系列中的元素数量

python - 为什么在 locals 中添加 key 实际上会创建变量?

python - 值错误 : Couldn't broadcast input array from shape (51) to (51, 1)

python - 用 BeautifulSoup 爬行深度

.net - 有没有办法从 Directory.EnumerateFiles 中的异常中恢复?

python - 在Python中引发异常时可以更改 "recent call"堆栈吗?

javascript - 如何将 url 参数传递给 couchdb 映射函数

ruby-on-rails - 我应该使用哪个适用于 Ruby 的 CouchDB 适配器?