Remove sys.exc_type, sys.exc_value, sys.exc_traceback
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 @@
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 @@
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 @@
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 @@
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 @@
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 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 @@
``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 @@
\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 @@
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 @@
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 @@
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 @@
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 @@
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 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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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 @@
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)