]> git.ipfire.org Git - thirdparty/psycopg.git/commitdiff
fix: shorter traceback on ctrl-c interrupt
authorDaniele Varrazzo <daniele.varrazzo@gmail.com>
Sun, 9 Apr 2023 18:45:09 +0000 (20:45 +0200)
committerDaniele Varrazzo <daniele.varrazzo@gmail.com>
Mon, 10 Apr 2023 08:45:44 +0000 (10:45 +0200)
psycopg/psycopg/_pipeline.py
psycopg/psycopg/connection.py
psycopg/psycopg/connection_async.py
psycopg/psycopg/cursor.py
psycopg/psycopg/cursor_async.py
psycopg/psycopg/errors.py
psycopg/psycopg/server_cursor.py

index 233d66b234f4664182e2282d00e4a32214196de3..ecd6f0628d815b9d79ce6974c000f4a8830c29cd 100644 (file)
@@ -219,7 +219,7 @@ class Pipeline(BasePipeline):
         try:
             with self._conn.lock:
                 self._conn.wait(self._sync_gen())
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
     def __enter__(self: _Self) -> _Self:
@@ -260,7 +260,7 @@ class AsyncPipeline(BasePipeline):
         try:
             async with self._conn.lock:
                 await self._conn.wait(self._sync_gen())
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
     async def __aenter__(self: _Self) -> _Self:
index 78ad57751a93128aea6a00498b18a597f4d98246..299c4f3ff6280b2826968a976a171b550bd769b4 100644 (file)
@@ -724,7 +724,7 @@ class Connection(BaseConnection[Row]):
                 cls._connect_gen(conninfo, autocommit=autocommit),
                 timeout=params["connect_timeout"],
             )
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
         if row_factory:
@@ -875,7 +875,7 @@ class Connection(BaseConnection[Row]):
 
             return cur.execute(query, params, prepare=prepare)
 
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
     def commit(self) -> None:
@@ -919,7 +919,7 @@ class Connection(BaseConnection[Row]):
             with self.lock:
                 try:
                     ns = self.wait(notifies(self.pgconn))
-                except e.Error as ex:
+                except e._NO_TRACEBACK as ex:
                     raise ex.with_traceback(None)
             enc = pgconn_encoding(self.pgconn)
             for pgn in ns:
index f6842c6ed47ebbecfcc049dec7813fc0ee388ca7..2490480757b02b8cf52e44a03eb0aa9c0a45f2a9 100644 (file)
@@ -125,7 +125,7 @@ class AsyncConnection(BaseConnection[Row]):
                 cls._connect_gen(conninfo, autocommit=autocommit),
                 timeout=params["connect_timeout"],
             )
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
         if row_factory:
@@ -281,7 +281,7 @@ class AsyncConnection(BaseConnection[Row]):
 
             return await cur.execute(query, params, prepare=prepare)
 
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
     async def commit(self) -> None:
@@ -316,7 +316,7 @@ class AsyncConnection(BaseConnection[Row]):
             async with self.lock:
                 try:
                     ns = await self.wait(notifies(self.pgconn))
-                except e.Error as ex:
+                except e._NO_TRACEBACK as ex:
                     raise ex.with_traceback(None)
             enc = pgconn_encoding(self.pgconn)
             for pgn in ns:
index 8379c589ab2835a6d08542dfaf736e474652601e..148ea10bb34eeaf6f3d7b8abbcad52ea7907f0f1 100644 (file)
@@ -719,7 +719,7 @@ class Cursor(BaseCursor["Connection[Any]", Row]):
                 self._conn.wait(
                     self._execute_gen(query, params, prepare=prepare, binary=binary)
                 )
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
         return self
 
@@ -754,7 +754,7 @@ class Cursor(BaseCursor["Connection[Any]", Row]):
                     self._conn.wait(
                         self._executemany_gen_no_pipeline(query, params_seq, returning)
                     )
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
     def stream(
@@ -780,7 +780,7 @@ class Cursor(BaseCursor["Connection[Any]", Row]):
                     yield rec
                     first = False
 
-            except e.Error as ex:
+            except e._NO_TRACEBACK as ex:
                 raise ex.with_traceback(None)
 
             finally:
@@ -898,7 +898,7 @@ class Cursor(BaseCursor["Connection[Any]", Row]):
 
             with Copy(self, writer=writer) as copy:
                 yield copy
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
         # If a fresher result has been set on the cursor by the Copy object,
index 405dc006437296b9adbda6b67ad09da0a3e3d381..ab7b07348273c6c17735a2f34bf60e8cb521a521 100644 (file)
@@ -90,7 +90,7 @@ class AsyncCursor(BaseCursor["AsyncConnection[Any]", Row]):
                 await self._conn.wait(
                     self._execute_gen(query, params, prepare=prepare, binary=binary)
                 )
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
         return self
 
@@ -121,7 +121,7 @@ class AsyncCursor(BaseCursor["AsyncConnection[Any]", Row]):
                 await self._conn.wait(
                     self._executemany_gen_no_pipeline(query, params_seq, returning)
                 )
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
     async def stream(
@@ -146,7 +146,7 @@ class AsyncCursor(BaseCursor["AsyncConnection[Any]", Row]):
                     yield rec
                     first = False
 
-            except e.Error as ex:
+            except e._NO_TRACEBACK as ex:
                 raise ex.with_traceback(None)
 
             finally:
@@ -234,7 +234,7 @@ class AsyncCursor(BaseCursor["AsyncConnection[Any]", Row]):
 
             async with AsyncCopy(self, writer=writer) as copy:
                 yield copy
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
         self._select_current_result(0)
index e1769546b7106a8a85490be7f512f16874fda4e2..d8b7f6fd83a5d7e4d72b008a88c575d0e25540d9 100644 (file)
@@ -20,6 +20,7 @@ DBAPI-defined Exceptions are defined in the following hierarchy::
 
 from typing import Any, Dict, Optional, Sequence, Tuple, Type, Union
 from typing_extensions import TypeAlias
+from asyncio import CancelledError
 
 from .pq.abc import PGconn, PGresult
 from .pq._enums import DiagnosticField
@@ -1533,3 +1534,11 @@ class IndexCorrupted(InternalError,
 
 # autogenerated: end
 # fmt: on
+
+# Don't show a complete traceback upon raising these exception.
+# Usually the traceback starts from internal functions (for instance in the
+# server communication callbacks) but, for the end user, it's more important
+# to get the high level information about where the exception was raised, for
+# instance in a certain `Cursor.execute()`.
+
+_NO_TRACEBACK = (Error, KeyboardInterrupt, CancelledError)
index 31b7f2e6744049dc434b5603a9883de0568d7b89..7a86e599d45c6bdb225ca311091c36a351b8b3e0 100644 (file)
@@ -290,7 +290,7 @@ class ServerCursor(ServerCursorMixin["Connection[Any]", Row], Cursor[Row]):
         try:
             with self._conn.lock:
                 self._conn.wait(self._declare_gen(query, params, binary))
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
         return self
@@ -426,7 +426,7 @@ class AsyncServerCursor(
         try:
             async with self._conn.lock:
                 await self._conn.wait(self._declare_gen(query, params, binary))
-        except e.Error as ex:
+        except e._NO_TRACEBACK as ex:
             raise ex.with_traceback(None)
 
         return self