如何处理和检查异常是否发生?

1 投票
3 回答
699 浏览
提问于 2025-04-17 23:08

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

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 异常,然后在父函数中捕获这个特定类型的异常,并进行相应的处理。

撰写回答