使用urllib2处理CouchDB的异常

2 投票
1 回答
1714 浏览
提问于 2025-04-16 08:38

我通常很难搞清楚怎么处理urllib2的异常,所以我还在学习。这里有一个场景,我想请教一下意见。

我有一个本地的CouchDB数据库。我想知道这个数据库是否存在,也就是说“127.0.0.1:5984/database”。如果它不存在,但我能访问“127.0.0.1:5984”,我想知道这样我就可以创建一个新的数据库。

我考虑了几个情况:

1) 我可能会遇到超时。

2) 我的URL写错了,比如我输入的是127.0.4.1:5984/database,但CouchDB实际上是在127.0.0.1:5984。

3) 数据库路径“database”在CouchDB中不存在。

所以我写了一些代码来处理这些情况:

我会测试响应。如果一切正常,我就把db_exists设置为True。只有在收到404错误时,我才会把db_exists设置为False。其他情况我就直接退出程序。

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)

1 个回答

1

我觉得你可能是从一个太基础的层面来解决这个问题。为什么不试试 couchdb-python 呢?

来回答你的问题,1) 这样做并不是特别干净。我建议你把异常处理部分的代码提取到一个方法里,这个方法可以从 urllib2.URLError 中提取出适合你应用的错误类型。至于问题2),几乎总是调用 sys.exit() 是不好的做法。应该抛出一个合适的异常。默认情况下,这个异常会向上冒泡并停止解释器,就像你的 sys.exit() 一样,不过会带有错误追踪信息。而且,因为你的 Couch 客户端是一个库,异常可以由应用程序自行处理。库代码不应该直接退出解释器。

撰写回答