如何在Python中正确使用try / except

时间:2015-01-23 16:07:02

标签: python pymongo

我有一个从MongoDB返回数据库连接处理程序的函数。我有各种其他函数调用DB,我想让连接处理程序抛出一个函数,所以我不必在每个函数中定义它。

这看起来不错吗?我想我的问题是,如果它无法与数据库服务器建立连接,它将同时打印两条消息Could not connect to serverNo hosts found我怎样才能打印#34;无法打印连接到服务器。"

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()

2 个答案:

答案 0 :(得分:10)

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

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;您现在正在捕捉所有,包括内存错误和键盘中断,请参阅Why is "except: pass" a bad programming practice?

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

except (AttributeError, pymongo.errors.OperationFailure):

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

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

请注意,您需要调整mongodb_conn()功能,以便在未设置的情况下尝试使用conn本地功能。如果你这样做,你将收到UnboundLocal错误:

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

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

答案 1 :(得分:0)

您还可以检查服务器是否可用 像这样:

        from pymongo.errors import ConnectionFailure
        client = MongoClient()
        try:
            # The ismaster command is cheap and does not require auth.
            client.admin.command('ismaster')
        except ConnectionFailure:
            print("Server not available")