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

Ответы на вопрос(2)

Ваш ответ на вопрос