Получение сообщений об ошибках из исключений psycopg2

Это мой первый проект, широко используя psycopg2. Я пытаюсь найти способ извлечь сообщение об ошибке psql всякий раз, когда попытка подключения терпит неудачу. Я проверил код ниже, будет работать, если все переменные установлены правильно, однако всякий раз, когда возникает условие ошибки (например, пользователь выбирает базу данных, которая не существует), Python даст мне следующее:

I am unable to connect to the database
None
Traceback (most recent call last):
  File "./duplicate_finder.py", line 163, in <module>
    main(sys.argv[1:])
  File "./duplicate_finder.py", line 142, in main
    print e.diag.message_detail
AttributeError: 'OperationalError' object has no attribute 'diag'

есть ли простой метод catch-all, чтобы поймать любое сообщение об ошибке, которое psql генерирует при подключении не удается или мне нужно писать, кроме блоков для нескольких исключений psycopg2?

извлечение из моего скрипта:

import sys, getopt, os, time, csv, psycopg2

    ...
    ...

    conn_string = "host=" + dbhost + " dbname=" + database + " user=" + dbuser + " password=" + dbpass
    try:
        conn = psycopg2.connect(conn_string)
    except psycopg2.Error as e:
        print "Unable to connect!"
        print e.pgerror
        print e.diag.message_detail
        sys.exit(1)
    else:
        print "Connected!"
        cur = conn.cursor()
        cur.execute("SELECT id, lastname, firstname, location FROM test ORDER BY ctl_upd_dttm DESC;")
        print cur.fetchone()
        ...
        conn.close()

2 ответов


вы ловите все исключения с базовым классом psycopg2.Error. Ваша проблема, вероятно, в том, что новые psycopg2 2.5. Какова ваша версия?

>>> print psycopg2.__version__
2.5.1 (dt dec pq3 ext)

когда я пытаюсь поймать исключения, e.pgerror всегда отсутствует для ошибок подключения. Следующий блок кода обходит это, напрямую печатая "e".

try:
    conn = psycopg2.connect(conn_string)
except psycopg2.OperationalError as e:
    print('Unable to connect!\n{0}').format(e)
    sys.exit(1)
else:
   print('Connected!')
   # do stuff

например, в случае сбоя аутентификации пароля:

Unable to connect!
FATAL:  password authentication failed for user "user"

Я понимаю, что этот вопрос является год, но, надеюсь, может помочь кому-то в будущем