diff --git a/NEWS b/NEWS index 46a393d5..5d26d711 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,10 @@ What's new in psycopg 2.9 ------------------------- - Dropped support for Python 3.4, 3.5 (:tickets:#1000, #1197). +- Reclassified SQLSTATE connection exceptions (08XXX) as + `~psycopg2.errors.OperationalError` (subclass of previously used + `~psycopg2.errors.DatabaseError`) (:ticket:`#1148`). + What's new in psycopg 2.8.6 ^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/psycopg/error_type.c b/psycopg/error_type.c index 37b4d4ae..60b2c48e 100644 --- a/psycopg/error_type.c +++ b/psycopg/error_type.c @@ -65,6 +65,8 @@ base_exception_from_sqlstate(const char *sqlstate) switch (sqlstate[0]) { case '0': switch (sqlstate[1]) { + case '8': /* Class 08 - Connection Exception */ + return OperationalError; case 'A': /* Class 0A - Feature Not Supported */ return NotSupportedError; } diff --git a/tests/test_errors.py b/tests/test_errors.py index bd3e7fd6..ec2950c5 100755 --- a/tests/test_errors.py +++ b/tests/test_errors.py @@ -62,6 +62,13 @@ class ErrorsTests(ConnectingTestCase): with self.assertRaises(KeyError): errors.lookup('XXXXX') + def test_connection_exceptions_backwards_compatibility(self): + err = errors.lookup('08000') + # connection exceptions are classified as operational errors + self.assert_(issubclass(err, errors.OperationalError)) + # previously these errors were classified only as DatabaseError + self.assert_(issubclass(err, errors.DatabaseError)) + def test_has_base_exceptions(self): excs = [] for n in dir(psycopg2):