处理并检查是否发生了异常?

时间:2014-03-20 13:11:31

标签: python python-3.x

我有一个处理异常的函数,后来我想知道是否发生异常。这是我的代码:

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

3 个答案:

答案 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