我有一个处理异常的函数,后来我想知道是否发生异常。这是我的代码:
def cx_runquery(query, conn_obj, fetch='all'):
"""
Run Query on the database
:param query: Query to execute (str)
:param conn_obj: Connection Object (obj)
:param fetch: Parameter with default='all' (str)
"""
cur = conn_obj.cursor()
try:
cur.execute(query)
if fetch == 'all':
return cur.fetchall()
elif fetch == 'one':
return cur.fetchone()
else:
raise ValueError('not a vaild option')
except cx_Oracle.DatabaseError as e:
error, = e.args
return error
调用上面的函数并将数据或错误返回给变量,如下所示:
output = cx_runquery('SELECT somerow FROM sometable', ora_conn, fetch='one')
如果发生错误(例如ORA-00942: table or view does not exist
),则output
变量为cx_Oracle._Error
object。
我写了以下测试,但我不知道这是好方法吗?
if isinstance(output, cx_Oracle._Error):
output = 'Database errror occured'
在我想做的伪代码中:
if cx_Oracle._Error occured:
do something ...
else
do something ...
如何检查是否发生异常(在这种情况下为cx_Oracle._Error
)?
答案 0 :(得分:1)
在Python中,您可以从函数返回多个结果。您可以考虑返回results, error
,其中一个值为None
。这样,客户端代码可以明确检查是否存在错误情况。如果您开始遇到不属于cx_Oracle._Error
类型的异常,这将非常有用。
另一种方法是简单地让异常失效并让你的调用代码处理错误。这是一种更惯用的方法,因为你真的不能对函数本身的错误做任何有用的事情。将其留给客户端,当引发异常时会发生什么。
答案 1 :(得分:1)
IMO实现的最佳方法是从子函数中引发异常并在父函数中捕获它。喜欢 -
def parent_function(query, conn_obj, fetch):
try:
cx_runquery(query, conn_obj, fetch='all')
#no error do something
except:
#error occured do somthing
def cx_runquery(query, conn_obj, fetch='all'):
"""
Run Query on the database
:param query: Query to execute (str)
:param conn_obj: Connection Object (obj)
:param fetch: Parameter with default='all' (str)
"""
cur = conn_obj.cursor()
try:
cur.execute(query)
if fetch == 'all':
return cur.fetchall()
elif fetch == 'one':
return cur.fetchone()
else:
raise ValueError('not a vaild option')
except cx_Oracle.DatabaseError as e:
error, = e.args
raise
因此,在parent_function
中,您可以对不同的行为执行不同的操作。
即使您可以从子功能中提升自定义异常或新异常,例如
raise Excetion('some exception')
此外,您可以从子函数和父函数中引发相同类型的cx_Oracle.DatabaseError
异常,捕获该特定类型的异常并执行必需的操作
答案 2 :(得分:1)
不要在函数中包含try块。使用try block来捕获它!
def cx_runquery(query, conn_obj, fetch='all'):
"""
Run Query on the database
:param query: Query to execute (str)
:param conn_obj: Connection Object (obj)
:param fetch: Parameter with default='all' (str)
"""
cur = conn_obj.cursor()
cur.execute(query)
if fetch == 'all':
return cur.fetchall()
elif fetch == 'one':
return cur.fetchone()
else:
raise ValueError('not a vaild option')
然后使用它:
try:
output = cx_runquery('SELECT somerow FROM sometable', ora_conn, fetch='one')
except cx_Oracle.DatabaseError as e:
output = "Database error occurred"
# do other error handling