Skip to content

bpo-47099: Replace with_traceback() with exception chaining and reraising #32074

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 30, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Lib/test/support/socket_helper.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
5 changes: 2 additions & 3 deletions Lib/urllib/parse.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
10 changes: 4 additions & 6 deletions Lib/urllib/request.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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."""
Expand Down Expand Up @@ -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."""
Expand Down Expand Up @@ -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')
Expand Down
3 changes: 1 addition & 2 deletions Lib/wsgiref/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Exception chaining is changed from
:func:`Exception.with_traceback`/:func:`sys.exc_info` to :pep:`3134`.
Patch by Oleg Iarygin.
Original file line number Diff line number Diff line change
@@ -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.