cx_Oracle и обработка исключений - хорошие практики?
Я пытаюсь использовать 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 и так далее.
Является ли вложение исключений хорошей идеей? Или есть лучший способ иметь дело с зависимыми / каскадными исключениями, подобными этому?
Кроме того, есть некоторые части (например, сбои соединения), где я хотел бы, чтобы скрипт просто завершился - отсюда закомментированоsys.exit()
вызов. Тем не менее, я слышал, что использование обработки исключений для управления потоком, как это плохая практика. Мысли?