Я работаю с некоторым кодом 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