Python / Django: как определить класс для указания в операторе «кроме»? - PullRequest
0 голосов
/ 16 ноября 2018

Я работаю с некоторым кодом Python / Django, который я унаследовал. В нем есть вызов БД, окруженный блоком try, с оператором «Exception Exception ex» для перехвата всех исключений. Я хочу быть более избирательным и поймать только тот тип исключения, который ожидаю. Изучив захваченный объект Exception, я могу сказать, что он имеет тип «DatabaseError».

Комментарии в моем коде ниже показывают много вещей, которые я пробовал, основываясь на поиске вопроса в Google и поиске здесь, наряду с ошибками, которые Python выдает мне, когда я их пробую. Больше всего расстраивает то, что я нашел в сети множество примеров кода, который, как говорят люди, работает, выглядит так, как я пытаюсь. Но примеры кода, которые я нахожу, обычно не содержат строки «import».

Я подозреваю, что мне нужно импортировать что-то еще, но я не могу понять, что.

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

1 Ответ

0 голосов
/ 19 ноября 2018

Правильный синтаксис выглядит следующим образом:

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), которые вы можете найти здесь: https://github.com/oracle/python-cx_Oracle/tree/master/samples.

Попробуйте запустить образцы и поработать с ними, чтобы посмотреть, сможете ли вы решить проблему. Если нет, создайте проблему, содержащую полный исполняемый образец, здесь: https://github.com/oracle/python-cx_Oracle/issues.

...