From ac3625fcb95c2c54e40e1a27f2395811adbed03e Mon Sep 17 00:00:00 2001
From: Neal Norwitz <nnorwitz@gmail.com>
Date: Fri, 17 Mar 2006 05:49:33 +0000
Subject: Remove sys.exc_type, sys.exc_value, sys.exc_traceback

---
 Demo/classes/Complex.py     |  2 +-
 Demo/pdist/server.py        |  2 +-
 Demo/sockets/gopher.py      |  3 ++-
 Doc/api/exceptions.tex      |  9 +++------
 Doc/api/intro.tex           |  7 ++-----
 Doc/ext/extending.tex       |  5 ++---
 Doc/lib/libtraceback.tex    | 11 +++--------
 Doc/ref/ref7.tex            | 20 +++++++-------------
 Lib/SimpleXMLRPCServer.py   |  4 ++--
 Lib/idlelib/WindowList.py   |  4 ++--
 Lib/lib-tk/Tkinter.py       |  2 +-
 Lib/traceback.py            |  4 +---
 Mac/Tools/IDE/PyDebugger.py | 11 +++++++----
 Mac/Tools/IDE/PyEdit.py     |  4 +---
 Python/sysmodule.c          |  4 ----
 Tools/faqwiz/faqw.py        |  2 +-
 16 files changed, 36 insertions(+), 58 deletions(-)

diff --git a/Demo/classes/Complex.py b/Demo/classes/Complex.py
index 2b306ad..a779897 100755
--- a/Demo/classes/Complex.py
+++ b/Demo/classes/Complex.py
@@ -233,7 +233,7 @@ def checkop(expr, a, b, value, fuzz = 1e-6):
     try:
         result = eval(expr)
     except:
-        result = sys.exc_type
+        result = sys.exc_info()[0]
     print '->', result
     if isinstance(result, str) or isinstance(value, str):
         ok = (result == value)
diff --git a/Demo/pdist/server.py b/Demo/pdist/server.py
index e692eea..01b3249 100755
--- a/Demo/pdist/server.py
+++ b/Demo/pdist/server.py
@@ -83,7 +83,7 @@ class Server:
                 method = getattr(self, methodname)
                 reply = (None, apply(method, args), id)
         except:
-            reply = (sys.exc_type, sys.exc_value, id)
+            reply = (sys.exc_info()[:2], id)
         if id < 0 and reply[:2] == (None, None):
             if self._verbose > 1: print "Suppress reply"
             return 1
diff --git a/Demo/sockets/gopher.py b/Demo/sockets/gopher.py
index cd76659..34bcdf0 100755
--- a/Demo/sockets/gopher.py
+++ b/Demo/sockets/gopher.py
@@ -191,7 +191,8 @@ def browse_menu(selector, host, port):
             try:
                 browserfunc(i_selector, i_host, i_port)
             except (IOError, socket.error):
-                print '***', sys.exc_type, ':', sys.exc_value
+                t, v, tb = sys.exc_info()
+                print '***', t, ':', v
         else:
             print 'Unsupported object type'
 
diff --git a/Doc/api/exceptions.tex b/Doc/api/exceptions.tex
index c4727f2..62f713b 100644
--- a/Doc/api/exceptions.tex
+++ b/Doc/api/exceptions.tex
@@ -23,12 +23,9 @@ carefully propagated, additional calls into the Python/C API may not
 behave as intended and may fail in mysterious ways.
 
 The error indicator consists of three Python objects corresponding to
-\withsubitem{(in module sys)}{
-  \ttindex{exc_type}\ttindex{exc_value}\ttindex{exc_traceback}}
-the Python variables \code{sys.exc_type}, \code{sys.exc_value} and
-\code{sys.exc_traceback}.  API functions exist to interact with the
-error indicator in various ways.  There is a separate error indicator
-for each thread.
+the result of \code{sys.exc_info()}.  API functions exist to interact
+with the error indicator in various ways.  There is a separate
+error indicator for each thread.
 
 % XXX Order of these should be more thoughtful.
 % Either alphabetical or some kind of structure.
diff --git a/Doc/api/intro.tex b/Doc/api/intro.tex
index d84b654..608d562 100644
--- a/Doc/api/intro.tex
+++ b/Doc/api/intro.tex
@@ -400,15 +400,12 @@ exception state.
 The full exception state consists of three objects (all of which can 
 be \NULL): the exception type, the corresponding exception 
 value, and the traceback.  These have the same meanings as the Python
-\withsubitem{(in module sys)}{
-  \ttindex{exc_type}\ttindex{exc_value}\ttindex{exc_traceback}}
-objects \code{sys.exc_type}, \code{sys.exc_value}, and
-\code{sys.exc_traceback}; however, they are not the same: the Python
+result of \code{sys.exc_info()}; however, they are not the same: the Python
 objects represent the last exception being handled by a Python 
 \keyword{try} \ldots\ \keyword{except} statement, while the C level
 exception state only exists while an exception is being passed on
 between C functions until it reaches the Python bytecode interpreter's 
-main loop, which takes care of transferring it to \code{sys.exc_type}
+main loop, which takes care of transferring it to \code{sys.exc_info()}
 and friends.
 
 Note that starting with Python 1.5, the preferred, thread-safe way to 
diff --git a/Doc/ext/extending.tex b/Doc/ext/extending.tex
index 7016f94..0e2fd14 100644
--- a/Doc/ext/extending.tex
+++ b/Doc/ext/extending.tex
@@ -120,9 +120,8 @@ variable is \NULL{} no exception has occurred.  A second global
 variable stores the ``associated value'' of the exception (the second
 argument to \keyword{raise}).  A third variable contains the stack
 traceback in case the error originated in Python code.  These three
-variables are the C equivalents of the Python variables
-\code{sys.exc_type}, \code{sys.exc_value} and \code{sys.exc_traceback} (see
-the section on module \module{sys} in the
+variables are the C equivalents of the result in Python of 
+\method{sys.exc_info()} (see the section on module \module{sys} in the
 \citetitle[../lib/lib.html]{Python Library Reference}).  It is
 important to know about them to understand how errors are passed
 around.
diff --git a/Doc/lib/libtraceback.tex b/Doc/lib/libtraceback.tex
index b7f61ac..80dc423 100644
--- a/Doc/lib/libtraceback.tex
+++ b/Doc/lib/libtraceback.tex
@@ -12,9 +12,8 @@ when you want to print stack traces under program control, such as in a
 ``wrapper'' around the interpreter.
 
 The module uses traceback objects --- this is the object type that is
-stored in the variables \code{sys.exc_traceback} (deprecated) and
-\code{sys.last_traceback} and returned as the third item from
-\function{sys.exc_info()}.
+stored in the \code{sys.last_traceback} variable and returned
+as the third item from \function{sys.exc_info()}.
 \obindex{traceback}
 
 The module defines the following functions:
@@ -41,11 +40,7 @@ with a caret indicating the approximate position of the error.
 \end{funcdesc}
 
 \begin{funcdesc}{print_exc}{\optional{limit\optional{, file}}}
-This is a shorthand for \code{print_exception(sys.exc_type,
-sys.exc_value, sys.exc_traceback, \var{limit}, \var{file})}.  (In
-fact, it uses \function{sys.exc_info()} to retrieve the same
-information in a thread-safe way instead of using the deprecated
-variables.)
+This is a shorthand for \code{print_exception(*\function{sys.exc_info()}}.
 \end{funcdesc}
 
 \begin{funcdesc}{format_exc}{\optional{limit}}
diff --git a/Doc/ref/ref7.tex b/Doc/ref/ref7.tex
index 4ae6040..90627a4 100644
--- a/Doc/ref/ref7.tex
+++ b/Doc/ref/ref7.tex
@@ -250,21 +250,15 @@ occurs in the try clause of the inner handler, the outer handler will
 not handle the exception.)
 
 Before an except clause's suite is executed, details about the
-exception are assigned to three variables in the
-\module{sys}\refbimodindex{sys} module: \code{sys.exc_type} receives
-the object identifying the exception; \code{sys.exc_value} receives
-the exception's parameter; \code{sys.exc_traceback} receives a
+exception are stored in the \module{sys}\refbimodindex{sys} module
+and can be access via \function{sys.exc_info()}. \function{sys.exc_info()}
+returns a 3-tuple consisting of: \code{exc_type} receives
+the object identifying the exception; \code{exc_value} receives
+the exception's parameter; \code{exc_traceback} receives a
 traceback object\obindex{traceback} (see section~\ref{traceback})
 identifying the point in the program where the exception occurred.
-These details are also available through the \function{sys.exc_info()}
-function, which returns a tuple \code{(\var{exc_type}, \var{exc_value},
-\var{exc_traceback})}.  Use of the corresponding variables is
-deprecated in favor of this function, since their use is unsafe in a
-threaded program.  As of Python 1.5, the variables are restored to
-their previous values (before the call) when returning from a function
-that handled an exception.
-\withsubitem{(in module sys)}{\ttindex{exc_type}
-  \ttindex{exc_value}\ttindex{exc_traceback}}
+\function{sys.exc_info()} values are restored to their previous values
+(before the call) when returning from a function that handled an exception.
 
 The optional \keyword{else} clause is executed if and when control
 flows off the end of the \keyword{try} clause.\footnote{
diff --git a/Lib/SimpleXMLRPCServer.py b/Lib/SimpleXMLRPCServer.py
index 052a8e4..156c2ba 100644
--- a/Lib/SimpleXMLRPCServer.py
+++ b/Lib/SimpleXMLRPCServer.py
@@ -261,7 +261,7 @@ class SimpleXMLRPCDispatcher:
         except:
             # report exception back to server
             response = xmlrpclib.dumps(
-                xmlrpclib.Fault(1, "%s:%s" % (sys.exc_type, sys.exc_value)),
+                xmlrpclib.Fault(1, "%s:%s" % sys.exc_info()[:2]),
                 encoding=self.encoding, allow_none=self.allow_none,
                 )
 
@@ -362,7 +362,7 @@ class SimpleXMLRPCDispatcher:
             except:
                 results.append(
                     {'faultCode' : 1,
-                     'faultString' : "%s:%s" % (sys.exc_type, sys.exc_value)}
+                     'faultString' : "%s:%s" % sys.exc_info()[:2]}
                     )
         return results
 
diff --git a/Lib/idlelib/WindowList.py b/Lib/idlelib/WindowList.py
index 658502b..d0123d8 100644
--- a/Lib/idlelib/WindowList.py
+++ b/Lib/idlelib/WindowList.py
@@ -45,8 +45,8 @@ class WindowList:
             try:
                 callback()
             except:
-                print "warning: callback failed in WindowList", \
-                      sys.exc_type, ":", sys.exc_value
+		t, v, tb = sys.exc_info()
+                print "warning: callback failed in WindowList", t, ":", v
 
 registry = WindowList()
 
diff --git a/Lib/lib-tk/Tkinter.py b/Lib/lib-tk/Tkinter.py
index 37ddd3a..d600cd7 100644
--- a/Lib/lib-tk/Tkinter.py
+++ b/Lib/lib-tk/Tkinter.py
@@ -1108,7 +1108,7 @@ class Misc:
     def _report_exception(self):
         """Internal function."""
         import sys
-        exc, val, tb = sys.exc_type, sys.exc_value, sys.exc_traceback
+        exc, val, tb = sys.exc_info()
         root = self._root()
         root.report_callback_exception(exc, val, tb)
     def _configure(self, cmd, cnf, kw):
diff --git a/Lib/traceback.py b/Lib/traceback.py
index 4971906..93a64b7 100644
--- a/Lib/traceback.py
+++ b/Lib/traceback.py
@@ -203,9 +203,7 @@ def _some_str(value):
 
 
 def print_exc(limit=None, file=None):
-    """Shorthand for 'print_exception(sys.exc_type, sys.exc_value, sys.exc_traceback, limit, file)'.
-    (In fact, it uses sys.exc_info() to retrieve the same information
-    in a thread-safe way.)"""
+    """Shorthand for 'print_exception(*sys.exc_info(), limit, file)'."""
     if file is None:
         file = sys.stderr
     try:
diff --git a/Mac/Tools/IDE/PyDebugger.py b/Mac/Tools/IDE/PyDebugger.py
index 5ee92d5..7fbc0f0 100644
--- a/Mac/Tools/IDE/PyDebugger.py
+++ b/Mac/Tools/IDE/PyDebugger.py
@@ -105,7 +105,8 @@ class Debugger(bdb.Bdb):
             raise 'spam'
         except:
             pass
-        frame = sys.exc_traceback.tb_frame
+        tb = sys.exc_info()[2]
+        frame = tb.tb_frame
         while frame is not None:
             del frame.f_trace
             frame = frame.f_back
@@ -527,7 +528,7 @@ class Debugger(bdb.Bdb):
                 raise bdb.BdbQuit
         except:
             print 'XXX Exception during debugger interaction.', \
-                            self.formatexception(sys.exc_type, sys.exc_value)
+                            self.formatexception(sys.exc_info[:2])
             import traceback
             traceback.print_exc()
             return self.trace_dispatch
@@ -855,7 +856,8 @@ def startfromhere():
     try:
         raise 'spam'
     except:
-        frame = sys.exc_traceback.tb_frame.f_back
+        tb = sys.exc_info()[2]
+        frame = tb.tb_frame.f_back
     d.start(frame)
 
 def startfrombottom():
@@ -876,7 +878,8 @@ def _getbottomframe():
         raise 'spam'
     except:
         pass
-    frame = sys.exc_traceback.tb_frame
+    tb = sys.exc_info()[2]
+    frame = tb.tb_frame
     while 1:
         if frame.f_code.co_name == 'mainloop' or frame.f_back is None:
             break
diff --git a/Mac/Tools/IDE/PyEdit.py b/Mac/Tools/IDE/PyEdit.py
index 88c72ac..56f3f8d 100644
--- a/Mac/Tools/IDE/PyEdit.py
+++ b/Mac/Tools/IDE/PyEdit.py
@@ -1212,7 +1212,7 @@ def execstring(pytext, globals, locals, filename="<string>", debugging=0,
     except:
         if debugging:
             sys.settrace(None)
-            PyDebugger.postmortem(sys.exc_type, sys.exc_value, sys.exc_traceback)
+            PyDebugger.postmortem(*sys.exc_info())
             return
         else:
             tracebackwindow.traceback(1, filename)
@@ -1289,7 +1289,6 @@ class _EditorDefaultSettings:
         settings = FontSettings.FontDialog(self.fontsettings, self.tabsettings)
         if settings:
             self.fontsettings, self.tabsettings = settings
-            sys.exc_traceback = None
             self.w.fonttext.set(self.template % (self.fontsettings[0], self.fontsettings[2]))
 
     def close(self):
@@ -1327,7 +1326,6 @@ def geteditorprefs():
         fontsettings = prefs.pyedit.fontsettings = ("Geneva", 0, 10, (0, 0, 0))
         tabsettings = prefs.pyedit.tabsettings = (8, 1)
         windowsize = prefs.pyedit.windowsize = (500, 250)
-        sys.exc_traceback = None
     return fontsettings, tabsettings, windowsize
 
 def seteditorprefs(fontsettings, tabsettings, windowsize):
diff --git a/Python/sysmodule.c b/Python/sysmodule.c
index dfa6ac8..875f73f 100644
--- a/Python/sysmodule.c
+++ b/Python/sysmodule.c
@@ -179,10 +179,6 @@ sys_exc_clear(PyObject *self, PyObject *noargs)
 	Py_XDECREF(tmp_type);
 	Py_XDECREF(tmp_value);
 	Py_XDECREF(tmp_tb);
-	/* For b/w compatibility */
-	PySys_SetObject("exc_type", Py_None);
-	PySys_SetObject("exc_value", Py_None);
-	PySys_SetObject("exc_traceback", Py_None);
 	Py_INCREF(Py_None);
 	return Py_None;
 }
diff --git a/Tools/faqwiz/faqw.py b/Tools/faqwiz/faqw.py
index 36c52e9..a26e0d6 100755
--- a/Tools/faqwiz/faqw.py
+++ b/Tools/faqwiz/faqw.py
@@ -27,7 +27,7 @@ try:
 except SystemExit, n:
     sys.exit(n)
 except:
-    t, v, tb = sys.exc_type, sys.exc_value, sys.exc_traceback
+    t, v, tb = sys.exc_info()
     print
     import cgi
     cgi.print_exception(t, v, tb)
-- 
cgit v0.12

