Python/Django:如何确定要在;除「;陈述

Python/Django:如何确定要在;除「;陈述,python,exception,exception-handling,cx-oracle,Python,Exception,Exception Handling,Cx Oracle,我正在使用我继承的一些Python/Django代码。其中有一个由try块包围的DB调用,用一个“Exception ex”语句捕获所有异常。我希望更具选择性,只捕获我预期的异常类型。通过检查捕获的异常对象,我可以判断它属于“DatabaseError”类型 下面代码中的注释显示了我尝试过的许多事情,这些事情都是基于谷歌搜索问题和在这里搜索,以及Python在我尝试时给我的错误。最令人沮丧的是,我在网上找到了很多人们认为有效的代码示例,这看起来就像我正在尝试的一样。但是我发现的代码示例通常不包括

我正在使用我继承的一些Python/Django代码。其中有一个由try块包围的DB调用,用一个“Exception ex”语句捕获所有异常。我希望更具选择性,只捕获我预期的异常类型。通过检查捕获的异常对象,我可以判断它属于“DatabaseError”类型

下面代码中的注释显示了我尝试过的许多事情,这些事情都是基于谷歌搜索问题和在这里搜索,以及Python在我尝试时给我的错误。最令人沮丧的是,我在网上找到了很多人们认为有效的代码示例,这看起来就像我正在尝试的一样。但是我发现的代码示例通常不包括“导入”行

我想我需要进口更多的东西,但我不知道是什么

import cx_Oracle
## import cx_Oracle.DatabaseError # creates an error saying "No name 'DatabaseError in module 'cx_Oracle'"
## from cx_Oracle import DatabaseError # creates an error saying "No name 'DatabaseError in module 'cx_Oracle'"
. . .
    connection = connections['ims_db']

    sqlUpdateQuery = "SELECT * FROM LOCKING WHERE IDENT={0} AND KEY_ID='SL_KEY' FOR UPDATE NOWAIT".format(self.serviceUid)
    cursor = connection.cursor()
    try:
        cursor.execute(sqlUpdateQuery)

    # this gets the error "Undefined variable 'Database'"
    ## except Database.DatabaseError as dbe3:

    # this gets the error "Undefined variable 'Oracle'"
    ## except Oracle.DatabaseError as dbe2:

    # this gets the error "Module 'cx_Oracle' has no 'DatabaseError' member"
    ## except cx_Oracle.DatabaseError as dbe:

    # this gets the error "Undefined variable 'DatabaseError'"
    ## except DatabaseError as dbe:

    # this gets the error "Catching an exception which doesn't inherit from BaseException: cx_Oracle"
    ## except cx_Oracle as dbe:

    # this gets the error "Module cx_Oracle has no '_error' member"
    ## except cx_Oracle._Error as dbe:

    except Exception as ex:
        # This gets the error "Module cx_Oracle has no 'DatabaseError' member"
        ## if isinstance(ex, cx_Oracle.DatabaseError) :

        # This gets the error "Undefined variable 'DatabaseError'"
        ## if isinstance(ex, DatabaseError) :

        className = type(ex).__name__
        # This logs "... class = DatabaseError ..."
        log.error("Exception (class = {1}) while locking service {0}".format(self.serviceUid, className))
        args = ex.args
        arg0=args[0]
        # arg0ClassName is "_Error"
        arg0ClassName = type(arg0).__name__
        code = arg0.code
        # codeClassName is "int"
        codeClassName = type(code).__name__
        msg = "Exception, code = {0}".format(code)
        log.debug(msg)
        raise

正确的语法如下所示:

try:
    cur.execute("some_sql_statement")
except cx_Oracle.DatabaseError as e:
    error, = e.args
    print("CONTEXT:", error.context)
    print("MESSAGE:", error.message)
您可以在这里找到的一些示例(如TypeHandlers.py)中看到该语法:


试着运行这些示例并与它们一起工作,看看是否可以解决您的问题。如果没有,请在此处创建一个包含完整可运行示例的问题:。

列出了
cx\U Oracle.DatabaseError
。也许是另一个“版本”?阴影模块?谢谢你的建议。我以前看过这个或类似的文档。如果我们有一个不同版本的cx_Oracle,我会非常惊讶,但谁知道呢。明天我有权限的时候,我得检查一下。但是,className是“DatabaseError”这一事实表明我使用的版本与此文档相匹配。我怀疑我的导入语句中可能缺少一些内容。我所拥有的是:“导入cx_Oracle”我应该拥有更多的还是不同的内容?您所需要的只是导入cx_Oracle。看看这些示例,你就会明白我的意思。我从一篇无关的帖子中了解到,这些“错误”是PyLint中的一个bug。我还没来得及证实这一点。