Skip to content

Commit b5a6db9

Browse files
authored
bpo-39717: [tarfile] update nested exception raising (GH-23739)
- `from None` if the new exception uses, or doesn't need, the previous one - `from e` if the previous exception is still relevant
1 parent 4b8cdfc commit b5a6db9

File tree

2 files changed

+34
-32
lines changed

2 files changed

+34
-32
lines changed

Lib/tarfile.py

Lines changed: 33 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ def itn(n, digits=8, format=DEFAULT_FORMAT):
200200
# base-256 representation. This allows values up to (256**(digits-1))-1.
201201
# A 0o200 byte indicates a positive number, a 0o377 byte a negative
202202
# number.
203+
original_n = n
203204
n = int(n)
204205
if 0 <= n < 8 ** (digits - 1):
205206
s = bytes("%0*o" % (digits - 1, n), "ascii") + NUL
@@ -363,7 +364,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize):
363364
try:
364365
import zlib
365366
except ImportError:
366-
raise CompressionError("zlib module is not available")
367+
raise CompressionError("zlib module is not available") from None
367368
self.zlib = zlib
368369
self.crc = zlib.crc32(b"")
369370
if mode == "r":
@@ -376,7 +377,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize):
376377
try:
377378
import bz2
378379
except ImportError:
379-
raise CompressionError("bz2 module is not available")
380+
raise CompressionError("bz2 module is not available") from None
380381
if mode == "r":
381382
self.dbuf = b""
382383
self.cmp = bz2.BZ2Decompressor()
@@ -388,7 +389,7 @@ def __init__(self, name, mode, comptype, fileobj, bufsize):
388389
try:
389390
import lzma
390391
except ImportError:
391-
raise CompressionError("lzma module is not available")
392+
raise CompressionError("lzma module is not available") from None
392393
if mode == "r":
393394
self.dbuf = b""
394395
self.cmp = lzma.LZMADecompressor()
@@ -541,8 +542,8 @@ def _read(self, size):
541542
break
542543
try:
543544
buf = self.cmp.decompress(buf)
544-
except self.exception:
545-
raise ReadError("invalid compressed data")
545+
except self.exception as e:
546+
raise ReadError("invalid compressed data") from e
546547
t.append(buf)
547548
c += len(buf)
548549
t = b"".join(t)
@@ -1164,8 +1165,8 @@ def _proc_gnulong(self, tarfile):
11641165
# Fetch the next header and process it.
11651166
try:
11661167
next = self.fromtarfile(tarfile)
1167-
except HeaderError:
1168-
raise SubsequentHeaderError("missing or bad subsequent header")
1168+
except HeaderError as e:
1169+
raise SubsequentHeaderError(str(e)) from None
11691170

11701171
# Patch the TarInfo object from the next header with
11711172
# the longname information.
@@ -1277,8 +1278,8 @@ def _proc_pax(self, tarfile):
12771278
# Fetch the next header.
12781279
try:
12791280
next = self.fromtarfile(tarfile)
1280-
except HeaderError:
1281-
raise SubsequentHeaderError("missing or bad subsequent header")
1281+
except HeaderError as e:
1282+
raise SubsequentHeaderError(str(e)) from None
12821283

12831284
# Process GNU sparse information.
12841285
if "GNU.sparse.map" in pax_headers:
@@ -1533,7 +1534,7 @@ def __init__(self, name=None, mode="r", fileobj=None, format=None,
15331534
self.fileobj.seek(self.offset)
15341535
break
15351536
except HeaderError as e:
1536-
raise ReadError(str(e))
1537+
raise ReadError(str(e)) from None
15371538

15381539
if self.mode in ("a", "w", "x"):
15391540
self._loaded = True
@@ -1669,21 +1670,21 @@ def gzopen(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
16691670
try:
16701671
from gzip import GzipFile
16711672
except ImportError:
1672-
raise CompressionError("gzip module is not available")
1673+
raise CompressionError("gzip module is not available") from None
16731674

16741675
try:
16751676
fileobj = GzipFile(name, mode + "b", compresslevel, fileobj)
1676-
except OSError:
1677+
except OSError as e:
16771678
if fileobj is not None and mode == 'r':
1678-
raise ReadError("not a gzip file")
1679+
raise ReadError("not a gzip file") from e
16791680
raise
16801681

16811682
try:
16821683
t = cls.taropen(name, mode, fileobj, **kwargs)
1683-
except OSError:
1684+
except OSError as e:
16841685
fileobj.close()
16851686
if mode == 'r':
1686-
raise ReadError("not a gzip file")
1687+
raise ReadError("not a gzip file") from e
16871688
raise
16881689
except:
16891690
fileobj.close()
@@ -1702,16 +1703,16 @@ def bz2open(cls, name, mode="r", fileobj=None, compresslevel=9, **kwargs):
17021703
try:
17031704
from bz2 import BZ2File
17041705
except ImportError:
1705-
raise CompressionError("bz2 module is not available")
1706+
raise CompressionError("bz2 module is not available") from None
17061707

17071708
fileobj = BZ2File(fileobj or name, mode, compresslevel=compresslevel)
17081709

17091710
try:
17101711
t = cls.taropen(name, mode, fileobj, **kwargs)
1711-
except (OSError, EOFError):
1712+
except (OSError, EOFError) as e:
17121713
fileobj.close()
17131714
if mode == 'r':
1714-
raise ReadError("not a bzip2 file")
1715+
raise ReadError("not a bzip2 file") from e
17151716
raise
17161717
except:
17171718
fileobj.close()
@@ -1730,16 +1731,16 @@ def xzopen(cls, name, mode="r", fileobj=None, preset=None, **kwargs):
17301731
try:
17311732
from lzma import LZMAFile, LZMAError
17321733
except ImportError:
1733-
raise CompressionError("lzma module is not available")
1734+
raise CompressionError("lzma module is not available") from None
17341735

17351736
fileobj = LZMAFile(fileobj or name, mode, preset=preset)
17361737

17371738
try:
17381739
t = cls.taropen(name, mode, fileobj, **kwargs)
1739-
except (LZMAError, EOFError):
1740+
except (LZMAError, EOFError) as e:
17401741
fileobj.close()
17411742
if mode == 'r':
1742-
raise ReadError("not an lzma file")
1743+
raise ReadError("not an lzma file") from e
17431744
raise
17441745
except:
17451746
fileobj.close()
@@ -2253,7 +2254,7 @@ def makelink(self, tarinfo, targetpath):
22532254
self._extract_member(self._find_link_target(tarinfo),
22542255
targetpath)
22552256
except KeyError:
2256-
raise ExtractError("unable to resolve link inside archive")
2257+
raise ExtractError("unable to resolve link inside archive") from None
22572258

22582259
def chown(self, tarinfo, targetpath, numeric_owner):
22592260
"""Set owner of targetpath according to tarinfo. If numeric_owner
@@ -2281,16 +2282,16 @@ def chown(self, tarinfo, targetpath, numeric_owner):
22812282
os.lchown(targetpath, u, g)
22822283
else:
22832284
os.chown(targetpath, u, g)
2284-
except OSError:
2285-
raise ExtractError("could not change owner")
2285+
except OSError as e:
2286+
raise ExtractError("could not change owner") from e
22862287

22872288
def chmod(self, tarinfo, targetpath):
22882289
"""Set file permissions of targetpath according to tarinfo.
22892290
"""
22902291
try:
22912292
os.chmod(targetpath, tarinfo.mode)
2292-
except OSError:
2293-
raise ExtractError("could not change mode")
2293+
except OSError as e:
2294+
raise ExtractError("could not change mode") from e
22942295

22952296
def utime(self, tarinfo, targetpath):
22962297
"""Set modification time of targetpath according to tarinfo.
@@ -2299,8 +2300,8 @@ def utime(self, tarinfo, targetpath):
22992300
return
23002301
try:
23012302
os.utime(targetpath, (tarinfo.mtime, tarinfo.mtime))
2302-
except OSError:
2303-
raise ExtractError("could not change modification time")
2303+
except OSError as e:
2304+
raise ExtractError("could not change modification time") from e
23042305

23052306
#--------------------------------------------------------------------------
23062307
def next(self):
@@ -2336,15 +2337,15 @@ def next(self):
23362337
self.offset += BLOCKSIZE
23372338
continue
23382339
elif self.offset == 0:
2339-
raise ReadError(str(e))
2340+
raise ReadError(str(e)) from None
23402341
except EmptyHeaderError:
23412342
if self.offset == 0:
2342-
raise ReadError("empty file")
2343+
raise ReadError("empty file") from None
23432344
except TruncatedHeaderError as e:
23442345
if self.offset == 0:
2345-
raise ReadError(str(e))
2346+
raise ReadError(str(e)) from None
23462347
except SubsequentHeaderError as e:
2347-
raise ReadError(str(e))
2348+
raise ReadError(str(e)) from None
23482349
break
23492350

23502351
if tarinfo is not None:
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[tarfile] update nested exception raising to use `from None` or `from e`

0 commit comments

Comments
 (0)