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

问题描述 投票:0回答:2

我有一个从 MongoDB 返回数据库连接处理程序的函数。我有各种其他函数可以调用数据库,我想让我们将连接处理程序放入一个函数中,这样我就不必在每个函数中定义它。

这看起来合适吗?我想我的问题是,如果它无法连接到数据库服务器,它将打印两条消息

Could not connect to server
No hosts found
我怎样才能只打印“无法连接到服务器。”

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()
python pymongo
2个回答
14
投票

conn = mongodb_conn()
调用 out 移至
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
;您现在正在捕获所有内容,包括内存错误和键盘中断,请参阅为什么“例外:传递”是一种不好的编程习惯?

仅使用特定的例外情况;您可以使用一个 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
投票
您还可以检查服务器是否可用 像这样:

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")
    
© www.soinside.com 2019 - 2024. All rights reserved.