From 63b67de2e7298cf8c831f652724711dc8a1f8109 Mon Sep 17 00:00:00 2001
From: Jeremy Hylton <jeremy@svn.zope.org>
Date: Thu, 1 Aug 2002 18:46:50 +0000
Subject: [PATCH] Make doubly sure that SystemExit isn't caught be generic
 error handling.

---
 trunk/src/ZEO/zrpc/connection.py | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/trunk/src/ZEO/zrpc/connection.py b/trunk/src/ZEO/zrpc/connection.py
index 75532ea5..fcc76541 100644
--- a/trunk/src/ZEO/zrpc/connection.py
+++ b/trunk/src/ZEO/zrpc/connection.py
@@ -167,11 +167,14 @@ class Connection(smac.SizedMessageAsyncConnection):
         meth = getattr(self.obj, name)
         try:
             ret = meth(*args)
+        except (SystemExit, KeyboardInterrupt):
+            raise
         except Exception, msg:
-            error = sys.exc_info()[:2]
-            log("%s() raised exception: %s" % (name, msg),
-                zLOG.ERROR, error=sys.exc_info())
-            return self.return_error(msgid, flags, error[0], error[1])
+            error = sys.exc_info()
+            log("%s() raised exception: %s" % (name, msg), zLOG.ERROR,
+                error=error)
+            error = error[:2]
+            return self.return_error(msgid, flags, *error)
 
         if flags & ASYNC:
             if ret is not None:
@@ -186,7 +189,9 @@ class Connection(smac.SizedMessageAsyncConnection):
                 self.send_reply(msgid, ret)
 
     def handle_error(self):
-        self.log_error()
+        if sys.exc_info()[0] == SystemExit:
+            raise sys.exc_info()
+        self.log_error("Error caught in asyncore")
         self.close()
 
     def log_error(self, msg="No error message supplied"):
-- 
2.30.9