[Python-checkins] Replace with_traceback() with exception chaining and reraising (GH-32074)
asvetlov
webhook-mailer at python.org
Wed Mar 30 08:28:41 EDT 2022
https://github.com/python/cpython/commit/a03a09e068435f47d02649dda93988dc44ffaaf1
commit: a03a09e068435f47d02649dda93988dc44ffaaf1
branch: main
author: Oleg Iarygin <oleg at arhadthedev.net>
committer: asvetlov <andrew.svetlov at gmail.com>
date: 2022-03-30T15:28:20+03:00
summary:
Replace with_traceback() with exception chaining and reraising (GH-32074)
files:
A Misc/NEWS.d/next/Library/2022-03-23-13-55-41.bpo-47099.P6quRP.rst
A Misc/NEWS.d/next/Library/2022-03-23-14-16-38.bpo-47099.2raait.rst
M Lib/test/support/socket_helper.py
M Lib/urllib/parse.py
M Lib/urllib/request.py
M Lib/wsgiref/handlers.py
diff --git a/Lib/test/support/socket_helper.py b/Lib/test/support/socket_helper.py
index b51677383ebc5..0ee7a5d69a1b3 100644
--- a/Lib/test/support/socket_helper.py
+++ b/Lib/test/support/socket_helper.py
@@ -256,7 +256,7 @@ def filter_error(err):
err = a[0]
# The error can also be wrapped as args[1]:
# except socket.error as msg:
- # raise OSError('socket error', msg).with_traceback(sys.exc_info()[2])
+ # raise OSError('socket error', msg) from msg
elif len(a) >= 2 and isinstance(a[1], OSError):
err = a[1]
else:
diff --git a/Lib/urllib/parse.py b/Lib/urllib/parse.py
index 67ba308c409a2..d70a6943f0a73 100644
--- a/Lib/urllib/parse.py
+++ b/Lib/urllib/parse.py
@@ -940,10 +940,9 @@ def urlencode(query, doseq=False, safe='', encoding=None, errors=None,
# but that's a minor nit. Since the original implementation
# allowed empty dicts that type of behavior probably should be
# preserved for consistency
- except TypeError:
- ty, va, tb = sys.exc_info()
+ except TypeError as err:
raise TypeError("not a valid non-string sequence "
- "or mapping object").with_traceback(tb)
+ "or mapping object") from err
l = []
if not doseq:
diff --git a/Lib/urllib/request.py b/Lib/urllib/request.py
index 02f96265a8900..84997f268c930 100644
--- a/Lib/urllib/request.py
+++ b/Lib/urllib/request.py
@@ -1579,8 +1579,7 @@ def ftp_open(self, req):
headers = email.message_from_string(headers)
return addinfourl(fp, headers, req.full_url)
except ftplib.all_errors as exp:
- exc = URLError('ftp error: %r' % exp)
- raise exc.with_traceback(sys.exc_info()[2])
+ raise URLError(f'ftp error: {exp}') from exp
def connect_ftp(self, user, passwd, host, port, dirs, timeout):
return ftpwrapper(user, passwd, host, port, dirs, timeout,
@@ -1791,7 +1790,7 @@ def open(self, fullurl, data=None):
except (HTTPError, URLError):
raise
except OSError as msg:
- raise OSError('socket error', msg).with_traceback(sys.exc_info()[2])
+ raise OSError('socket error', msg) from msg
def open_unknown(self, fullurl, data=None):
"""Overridable interface to open unknown URL type."""
@@ -2093,7 +2092,7 @@ def open_ftp(self, url):
headers = email.message_from_string(headers)
return addinfourl(fp, headers, "ftp:" + url)
except ftperrors() as exp:
- raise URLError('ftp error %r' % exp).with_traceback(sys.exc_info()[2])
+ raise URLError(f'ftp error: {exp}') from exp
def open_data(self, url, data=None):
"""Use "data" URL."""
@@ -2443,8 +2442,7 @@ def retrfile(self, file, type):
conn, retrlen = self.ftp.ntransfercmd(cmd)
except ftplib.error_perm as reason:
if str(reason)[:3] != '550':
- raise URLError('ftp error: %r' % reason).with_traceback(
- sys.exc_info()[2])
+ raise URLError(f'ftp error: {reason}') from reason
if not conn:
# Set transfer mode to ASCII!
self.ftp.voidcmd('TYPE A')
diff --git a/Lib/wsgiref/handlers.py b/Lib/wsgiref/handlers.py
index 31360e58785ac..6623b700537cf 100644
--- a/Lib/wsgiref/handlers.py
+++ b/Lib/wsgiref/handlers.py
@@ -228,8 +228,7 @@ def start_response(self, status, headers,exc_info=None):
if exc_info:
try:
if self.headers_sent:
- # Re-raise original exception if headers sent
- raise exc_info[0](exc_info[1]).with_traceback(exc_info[2])
+ raise
finally:
exc_info = None # avoid dangling circular ref
elif self.headers is not None:
diff --git a/Misc/NEWS.d/next/Library/2022-03-23-13-55-41.bpo-47099.P6quRP.rst b/Misc/NEWS.d/next/Library/2022-03-23-13-55-41.bpo-47099.P6quRP.rst
new file mode 100644
index 0000000000000..fa2c87e941e8b
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-03-23-13-55-41.bpo-47099.P6quRP.rst
@@ -0,0 +1,3 @@
+Exception chaining is changed from
+:func:`Exception.with_traceback`/:func:`sys.exc_info` to :pep:`3134`.
+Patch by Oleg Iarygin.
diff --git a/Misc/NEWS.d/next/Library/2022-03-23-14-16-38.bpo-47099.2raait.rst b/Misc/NEWS.d/next/Library/2022-03-23-14-16-38.bpo-47099.2raait.rst
new file mode 100644
index 0000000000000..785e53c123f91
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2022-03-23-14-16-38.bpo-47099.2raait.rst
@@ -0,0 +1,5 @@
+All :exc:`URLError` exception messages raised in
+:class:`urllib.request.URLopener` now contain a colon between ``ftp error``
+and the rest of the message. Previously,
+:func:`~urllib.request.URLopener.open_ftp` missed the colon. Patch by Oleg
+Iarygin.
More information about the Python-checkins
mailing list