如何在 Python 中正确使用 try/except
How to properly use try/except in Python
我有一个函数 returns 来自 MongoDB 的数据库连接处理程序。我还有其他各种调用数据库的函数,我认为让我们将连接处理程序放入一个函数中,这样我就不必在每个函数中都定义它了。
这样看起来对吗?我想我的问题是,如果它无法连接到数据库服务器,它将打印消息 Could not connect to server
和 No hosts found
我怎样才能只打印 "Could not connect to the server."
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()
调用 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
;您现在正在捕获 所有东西,包括内存错误和键盘中断,请参阅 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
现在函数 returns 如果连接成功,None
如果连接失败。
您还可以查看服务器是否可用
像这样:
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")
我有一个函数 returns 来自 MongoDB 的数据库连接处理程序。我还有其他各种调用数据库的函数,我认为让我们将连接处理程序放入一个函数中,这样我就不必在每个函数中都定义它了。
这样看起来对吗?我想我的问题是,如果它无法连接到数据库服务器,它将打印消息 Could not connect to server
和 No hosts found
我怎样才能只打印 "Could not connect to the server."
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()
调用 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
;您现在正在捕获 所有东西,包括内存错误和键盘中断,请参阅 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
现在函数 returns 如果连接成功,None
如果连接失败。
您还可以查看服务器是否可用 像这样:
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")