diff --git a/asyncpg/exceptions/_base.py b/asyncpg/exceptions/_base.py index c2d1e7ef..89ac6f99 100644 --- a/asyncpg/exceptions/_base.py +++ b/asyncpg/exceptions/_base.py @@ -65,7 +65,7 @@ def get_message_class_for_sqlstate(mcls, code): class PostgresMessage(metaclass=PostgresMessageMeta): def __str__(self): - msg = self.message + msg = self.args[0] if self.detail: msg += '\nDETAIL: {}'.format(self.detail) if self.hint: @@ -87,13 +87,13 @@ def new(cls, fields, query=None): if field: mapped[field] = v - e = exccls(mapped.get('message')) + e = exccls(mapped.get('message', '')) e.__dict__.update(mapped) return e -class PostgresError(Exception, PostgresMessage): +class PostgresError(PostgresMessage, Exception): """Base class for all Postgres errors.""" diff --git a/tests/test_exceptions.py b/tests/test_exceptions.py index d904f6b0..5149a65c 100644 --- a/tests/test_exceptions.py +++ b/tests/test_exceptions.py @@ -23,12 +23,28 @@ def test_exceptions_exported(self): self.assertIsNone(asyncpg.PostgresError.schema_name) async def test_exceptions_unpacking(self): - with self.assertRaises(asyncpg.UndefinedTableError): - try: - await self.con.execute('SELECT * FROM _nonexistent_') - except asyncpg.UndefinedTableError as e: - self.assertEqual(e.sqlstate, '42P01') - self.assertEqual(e.position, '15') - self.assertEqual(e.query, 'SELECT * FROM _nonexistent_') - self.assertIsNotNone(e.severity) - raise + try: + await self.con.execute('SELECT * FROM _nonexistent_') + except asyncpg.UndefinedTableError as e: + self.assertEqual(e.sqlstate, '42P01') + self.assertEqual(e.position, '15') + self.assertEqual(e.query, 'SELECT * FROM _nonexistent_') + self.assertIsNotNone(e.severity) + else: + self.fail('UndefinedTableError not raised') + + async def test_exceptions_str(self): + try: + await self.con.execute(''' + CREATE FUNCTION foo() RETURNS bool AS $$ $$ LANGUAGE SQL; + ''') + except asyncpg.InvalidFunctionDefinitionError as e: + self.assertEqual( + e.detail, + "Function's final statement must be SELECT or " + "INSERT/UPDATE/DELETE RETURNING.") + self.assertIn( + 'DETAIL: Function', str(e) + ) + else: + self.fail('InvalidFunctionDefinitionError not raised')