关于pymongo:如何在Python中正确使用try / except

How to properly use try/except in Python

我有一个函数从mongodb返回db连接处理程序。我还有很多其他函数可以调用DB,我想让我们把连接处理程序扔到一个函数中,这样我就不必在每个函数中定义它了。

这个看起来对吗?我想我的问题是,如果它不能连接到数据库服务器,它会同时打印Could not connect to serverNo hosts found两条消息,我怎么才能只打印"无法连接到服务器"。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def mongodb_conn():
    try:
        conn = pymongo.MongoClient()
    except pymongo.errors.ConnectionFailure, e:
        print"Could not connect to server: %s" % e
    return conn

def get_hosts()
    try:
        conn = mongodb_conn()
        mongodb = conn.dbname.collection

        b = []
        hosts_obj = mongodb.find({'_id': 'PR'})
        for x in hosts_obj:
            print x
    except:
        print"No hosts found"

get_hosts()


将您的conn = mongodb_conn()调用移出try .. except处理程序,并测试是否返回None

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def get_hosts()
    conn = mongodb_conn()
    if conn is None:
        # no connection, exit early
        return

    try:
        mongodb = conn.dbname.collection

        b = []
        hosts_obj = mongodb.find({'_id': 'PR'})
        for x in hosts_obj:
            print x
    except:
        print"No hosts found"

无论如何,您应该避免使用一个毯子except;您现在可以捕捉到所有的东西,包括内存错误和键盘中断,明白为什么"except:pass"是一个糟糕的编程实践吗?

仅使用特定的异常;您可以使用一条except语句捕获多个异常类型:

1
except (AttributeError, pymongo.errors.OperationFailure):

也可以使用多个except语句以不同的方式处理不同的异常。

将异常处理程序限制为代码中可以引发异常的部分。例如,for x in hosts_obj:循环可能不会抛出AttributeError异常,因此它可能不应是try块的一部分。

请注意,如果没有设置,您需要调整您的mongodb_conn()功能,以避免尝试使用conn本地;如果这样做,您将得到UnboundLocal错误:

1
2
3
4
5
def mongodb_conn():
    try:
        return pymongo.MongoClient()
    except pymongo.errors.ConnectionFailure, e:
        print"Could not connect to server: %s" % e

现在,如果连接成功,函数将返回连接;如果连接失败,则返回None