如何处理和检查异常是否发生?
我有一个函数用来处理异常,之后我想知道是否发生了异常。以下是我的代码:
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
对象。
我写了以下测试,但 我不知道这样做是否合适?
if isinstance(output, cx_Oracle._Error):
output = 'Database errror occured'
在伪代码中,我想做以下事情:
if cx_Oracle._Error occured:
do something ...
else
do something ...
如何检查是否发生了异常(在这个例子中是 cx_Oracle._Error
)?
3 个回答
1
在Python中,你可以从一个函数返回多个结果。你可能会想返回 results, error
,其中一个值可以是 None
。这样,调用这个函数的代码就可以明确检查是否存在错误。这在你开始遇到一些不是 cx_Oracle._Error
类型的异常时特别有用。
另一种方法是让异常不被捕获,让调用你这个函数的代码来处理错误。这种做法更符合Python的习惯,因为在函数内部你其实无法对错误做什么有用的处理。发生异常时,处理方式就留给调用者去决定吧。
1
不要把try块放在函数里面。要在你想要捕获错误的地方使用try块!
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
1
在我看来,最好的做法是让子函数抛出一个异常,然后在父函数中捕获这个异常。就像这样 -
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
异常,然后在父函数中捕获这个特定类型的异常,并进行相应的处理。