Я пытаюсь использовать cx_Oracle для подключения к экземпляру Oracle и выполнять некоторые инструкции DDL:
db = None
try:
db = cx_Oracle.connect('username', 'password', 'hostname:port/SERVICENAME')
#print(db.version)
except cx_Oracle.DatabaseError as e:
error, = e.args
if error.code == 1017:
print('Please check your credentials.')
# sys.exit()?
else:
print('Database connection error: %s'.format(e))
cursor = db.cursor()
try:
cursor.execute(ddl_statements)
except cx_Oracle.DatabaseError as e:
error, = e.args
if error.code == 955:
print('Table already exists')
if error.code == 1031:
print("Insufficient privileges - are you sure you're using the owner account?")
print(error.code)
print(error.message)
print(error.context)
cursor.close()
db.commit()
db.close()
Однако я не совсем уверен, какой лучший дизайн для обработки исключений здесь.
Во-первых, я создаю объект db
внутри блока try, чтобы уловить любые ошибки соединения.
Однако, если он не может подключиться, то db
не будет существовать дальше - вот почему я установил db = None
выше. Однако это хорошая практика?
В идеале мне нужно ловить ошибки с подключением, затем ошибки с запуском DDL-операторов и т.д.
Является ли исключение гнездования хорошей идеей? Или есть лучший способ справиться с зависимыми/каскадными исключениями, подобными этому?
Кроме того, есть некоторые части (например, сбои подключения), где я хотел бы, чтобы script просто закончил - следовательно, прокомментировал вызов sys.exit()
. Тем не менее, я слышал, что использование обработки исключений для управления потоком, как это, является плохой практикой. Мысли?