Fix exception causes all over the codebase

This commit is contained in:
Ram Rachum 2020-06-21 13:13:35 +03:00
parent 9f5cd11ae2
commit 2f0d430807
26 changed files with 125 additions and 123 deletions

View File

@ -249,8 +249,8 @@ class DXT1Decoder(ImageFile.PyDecoder):
def decode(self, buffer): def decode(self, buffer):
try: try:
self.set_as_raw(_dxt1(self.fd, self.state.xsize, self.state.ysize)) self.set_as_raw(_dxt1(self.fd, self.state.xsize, self.state.ysize))
except struct.error: except struct.error as e:
raise OSError("Truncated DDS file") raise OSError("Truncated DDS file") from e
return 0, 0 return 0, 0
@ -260,8 +260,8 @@ class DXT5Decoder(ImageFile.PyDecoder):
def decode(self, buffer): def decode(self, buffer):
try: try:
self.set_as_raw(_dxt5(self.fd, self.state.xsize, self.state.ysize)) self.set_as_raw(_dxt5(self.fd, self.state.xsize, self.state.ysize))
except struct.error: except struct.error as e:
raise OSError("Truncated DDS file") raise OSError("Truncated DDS file") from e
return 0, 0 return 0, 0

View File

@ -282,8 +282,8 @@ class _BLPBaseDecoder(ImageFile.PyDecoder):
self.magic = self.fd.read(4) self.magic = self.fd.read(4)
self._read_blp_header() self._read_blp_header()
self._load() self._load()
except struct.error: except struct.error as e:
raise OSError("Truncated Blp file") raise OSError("Truncated Blp file") from e
return 0, 0 return 0, 0
def _read_palette(self): def _read_palette(self):

View File

@ -304,8 +304,8 @@ def _dib_save(im, fp, filename):
def _save(im, fp, filename, bitmap_header=True): def _save(im, fp, filename, bitmap_header=True):
try: try:
rawmode, bits, colors = SAVE[im.mode] rawmode, bits, colors = SAVE[im.mode]
except KeyError: except KeyError as e:
raise OSError("cannot write mode %s as BMP" % im.mode) raise OSError("cannot write mode %s as BMP" % im.mode) from e
info = im.encoderinfo info = im.encoderinfo

View File

@ -231,8 +231,8 @@ class EpsImageFile(ImageFile.ImageFile):
try: try:
m = split.match(s) m = split.match(s)
except re.error: except re.error as e:
raise SyntaxError("not an EPS file") raise SyntaxError("not an EPS file") from e
if m: if m:
k, v = m.group(1, 2) k, v = m.group(1, 2)

View File

@ -59,8 +59,8 @@ class FpxImageFile(ImageFile.ImageFile):
try: try:
self.ole = olefile.OleFileIO(self.fp) self.ole = olefile.OleFileIO(self.fp)
except OSError: except OSError as e:
raise SyntaxError("not an FPX file; invalid OLE file") raise SyntaxError("not an FPX file; invalid OLE file") from e
if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B": if self.ole.root.clsid != "56616700-C154-11CE-8553-00AA00A1F95B":
raise SyntaxError("not an FPX file; bad root CLSID") raise SyntaxError("not an FPX file; bad root CLSID")

View File

@ -81,5 +81,5 @@ def open(fp, mode="r"):
try: try:
return GdImageFile(fp) return GdImageFile(fp)
except SyntaxError: except SyntaxError as e:
raise UnidentifiedImageError("cannot identify this image file") raise UnidentifiedImageError("cannot identify this image file") from e

View File

@ -130,9 +130,9 @@ class GifImageFile(ImageFile.ImageFile):
for f in range(self.__frame + 1, frame + 1): for f in range(self.__frame + 1, frame + 1):
try: try:
self._seek(f) self._seek(f)
except EOFError: except EOFError as e:
self.seek(last_frame) self.seek(last_frame)
raise EOFError("no more images in GIF file") raise EOFError("no more images in GIF file") from e
def _seek(self, frame): def _seek(self, frame):

View File

@ -163,8 +163,8 @@ class ImImageFile(ImageFile.ImageFile):
try: try:
m = split.match(s) m = split.match(s)
except re.error: except re.error as e:
raise SyntaxError("not an IM file") raise SyntaxError("not an IM file") from e
if m: if m:
@ -341,8 +341,8 @@ def _save(im, fp, filename):
try: try:
image_type, rawmode = SAVE[im.mode] image_type, rawmode = SAVE[im.mode]
except KeyError: except KeyError as e:
raise ValueError("Cannot save %s images as IM" % im.mode) raise ValueError("Cannot save %s images as IM" % im.mode) from e
frames = im.encoderinfo.get("frames", 1) frames = im.encoderinfo.get("frames", 1)

View File

@ -434,8 +434,8 @@ def _getdecoder(mode, decoder_name, args, extra=()):
try: try:
# get decoder # get decoder
decoder = getattr(core, decoder_name + "_decoder") decoder = getattr(core, decoder_name + "_decoder")
except AttributeError: except AttributeError as e:
raise OSError("decoder %s not available" % decoder_name) raise OSError("decoder %s not available" % decoder_name) from e
return decoder(mode, *args + extra) return decoder(mode, *args + extra)
@ -457,8 +457,8 @@ def _getencoder(mode, encoder_name, args, extra=()):
try: try:
# get encoder # get encoder
encoder = getattr(core, encoder_name + "_encoder") encoder = getattr(core, encoder_name + "_encoder")
except AttributeError: except AttributeError as e:
raise OSError("encoder %s not available" % encoder_name) raise OSError("encoder %s not available" % encoder_name) from e
return encoder(mode, *args + extra) return encoder(mode, *args + extra)
@ -971,10 +971,10 @@ class Image:
if isinstance(t, tuple): if isinstance(t, tuple):
try: try:
t = trns_im.palette.getcolor(t) t = trns_im.palette.getcolor(t)
except Exception: except Exception as e:
raise ValueError( raise ValueError(
"Couldn't allocate a palette color for transparency" "Couldn't allocate a palette color for transparency"
) ) from e
trns_im.putpixel((0, 0), t) trns_im.putpixel((0, 0), t)
if mode in ("L", "RGB"): if mode in ("L", "RGB"):
@ -1027,8 +1027,8 @@ class Image:
# normalize source image and try again # normalize source image and try again
im = self.im.convert(getmodebase(self.mode)) im = self.im.convert(getmodebase(self.mode))
im = im.convert(mode, dither) im = im.convert(mode, dither)
except KeyError: except KeyError as e:
raise ValueError("illegal conversion") raise ValueError("illegal conversion") from e
new_im = self._new(im) new_im = self._new(im)
if delete_trns: if delete_trns:
@ -1625,16 +1625,16 @@ class Image:
mode = getmodebase(self.mode) + "A" mode = getmodebase(self.mode) + "A"
try: try:
self.im.setmode(mode) self.im.setmode(mode)
except (AttributeError, ValueError): except (AttributeError, ValueError) as e:
# do things the hard way # do things the hard way
im = self.im.convert(mode) im = self.im.convert(mode)
if im.mode not in ("LA", "PA", "RGBA"): if im.mode not in ("LA", "PA", "RGBA"):
raise ValueError # sanity check raise ValueError from e # sanity check
self.im = im self.im = im
self.pyaccess = None self.pyaccess = None
self.mode = self.im.mode self.mode = self.im.mode
except (KeyError, ValueError): except (KeyError, ValueError) as e:
raise ValueError("illegal image mode") raise ValueError("illegal image mode") from e
if self.mode in ("LA", "PA"): if self.mode in ("LA", "PA"):
band = 1 band = 1
@ -2136,8 +2136,8 @@ class Image:
init() init()
try: try:
format = EXTENSION[ext] format = EXTENSION[ext]
except KeyError: except KeyError as e:
raise ValueError("unknown file extension: {}".format(ext)) raise ValueError("unknown file extension: {}".format(ext)) from e
if format.upper() not in SAVE: if format.upper() not in SAVE:
init() init()
@ -2238,8 +2238,8 @@ class Image:
if isinstance(channel, str): if isinstance(channel, str):
try: try:
channel = self.getbands().index(channel) channel = self.getbands().index(channel)
except ValueError: except ValueError as e:
raise ValueError('The image has no channel "{}"'.format(channel)) raise ValueError('The image has no channel "{}"'.format(channel)) from e
return self._new(self.im.getband(channel)) return self._new(self.im.getband(channel))
@ -2736,12 +2736,12 @@ def fromarray(obj, mode=None):
if mode is None: if mode is None:
try: try:
typekey = (1, 1) + shape[2:], arr["typestr"] typekey = (1, 1) + shape[2:], arr["typestr"]
except KeyError: except KeyError as e:
raise TypeError("Cannot handle this data type") raise TypeError("Cannot handle this data type") from e
try: try:
mode, rawmode = _fromarray_typemap[typekey] mode, rawmode = _fromarray_typemap[typekey]
except KeyError: except KeyError as e:
raise TypeError("Cannot handle this data type: %s, %s" % typekey) raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e
else: else:
rawmode = mode rawmode = mode
if mode in ["1", "L", "I", "P", "F"]: if mode in ["1", "L", "I", "P", "F"]:

View File

@ -369,7 +369,7 @@ def profileToProfile(
else: else:
imOut = transform.apply(im) imOut = transform.apply(im)
except (OSError, TypeError, ValueError) as v: except (OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
return imOut return imOut
@ -393,7 +393,7 @@ def getOpenProfile(profileFilename):
try: try:
return ImageCmsProfile(profileFilename) return ImageCmsProfile(profileFilename)
except (OSError, TypeError, ValueError) as v: except (OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def buildTransform( def buildTransform(
@ -474,7 +474,7 @@ def buildTransform(
inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags inputProfile, outputProfile, inMode, outMode, renderingIntent, flags=flags
) )
except (OSError, TypeError, ValueError) as v: except (OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def buildProofTransform( def buildProofTransform(
@ -585,7 +585,7 @@ def buildProofTransform(
flags, flags,
) )
except (OSError, TypeError, ValueError) as v: except (OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
buildTransformFromOpenProfiles = buildTransform buildTransformFromOpenProfiles = buildTransform
@ -640,7 +640,7 @@ def applyTransform(im, transform, inPlace=False):
else: else:
imOut = transform.apply(im) imOut = transform.apply(im)
except (TypeError, ValueError) as v: except (TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
return imOut return imOut
@ -682,15 +682,15 @@ def createProfile(colorSpace, colorTemp=-1):
if colorSpace == "LAB": if colorSpace == "LAB":
try: try:
colorTemp = float(colorTemp) colorTemp = float(colorTemp)
except (TypeError, ValueError): except (TypeError, ValueError) as e:
raise PyCMSError( raise PyCMSError(
'Color temperature must be numeric, "%s" not valid' % colorTemp 'Color temperature must be numeric, "%s" not valid' % colorTemp
) ) from e
try: try:
return core.createProfile(colorSpace, colorTemp) return core.createProfile(colorSpace, colorTemp)
except (TypeError, ValueError) as v: except (TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def getProfileName(profile): def getProfileName(profile):
@ -732,7 +732,7 @@ def getProfileName(profile):
return "{} - {}\n".format(model, manufacturer) return "{} - {}\n".format(model, manufacturer)
except (AttributeError, OSError, TypeError, ValueError) as v: except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def getProfileInfo(profile): def getProfileInfo(profile):
@ -772,7 +772,7 @@ def getProfileInfo(profile):
return "\r\n\r\n".join(arr) + "\r\n\r\n" return "\r\n\r\n".join(arr) + "\r\n\r\n"
except (AttributeError, OSError, TypeError, ValueError) as v: except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def getProfileCopyright(profile): def getProfileCopyright(profile):
@ -800,7 +800,7 @@ def getProfileCopyright(profile):
profile = ImageCmsProfile(profile) profile = ImageCmsProfile(profile)
return (profile.profile.copyright or "") + "\n" return (profile.profile.copyright or "") + "\n"
except (AttributeError, OSError, TypeError, ValueError) as v: except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def getProfileManufacturer(profile): def getProfileManufacturer(profile):
@ -828,7 +828,7 @@ def getProfileManufacturer(profile):
profile = ImageCmsProfile(profile) profile = ImageCmsProfile(profile)
return (profile.profile.manufacturer or "") + "\n" return (profile.profile.manufacturer or "") + "\n"
except (AttributeError, OSError, TypeError, ValueError) as v: except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def getProfileModel(profile): def getProfileModel(profile):
@ -857,7 +857,7 @@ def getProfileModel(profile):
profile = ImageCmsProfile(profile) profile = ImageCmsProfile(profile)
return (profile.profile.model or "") + "\n" return (profile.profile.model or "") + "\n"
except (AttributeError, OSError, TypeError, ValueError) as v: except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def getProfileDescription(profile): def getProfileDescription(profile):
@ -886,7 +886,7 @@ def getProfileDescription(profile):
profile = ImageCmsProfile(profile) profile = ImageCmsProfile(profile)
return (profile.profile.profile_description or "") + "\n" return (profile.profile.profile_description or "") + "\n"
except (AttributeError, OSError, TypeError, ValueError) as v: except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def getDefaultIntent(profile): def getDefaultIntent(profile):
@ -925,7 +925,7 @@ def getDefaultIntent(profile):
profile = ImageCmsProfile(profile) profile = ImageCmsProfile(profile)
return profile.profile.rendering_intent return profile.profile.rendering_intent
except (AttributeError, OSError, TypeError, ValueError) as v: except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def isIntentSupported(profile, intent, direction): def isIntentSupported(profile, intent, direction):
@ -976,7 +976,7 @@ def isIntentSupported(profile, intent, direction):
else: else:
return -1 return -1
except (AttributeError, OSError, TypeError, ValueError) as v: except (AttributeError, OSError, TypeError, ValueError) as v:
raise PyCMSError(v) raise PyCMSError(v) from v
def versions(): def versions():

View File

@ -122,7 +122,7 @@ class ImageFile(Image.Image):
EOFError, # got header but not the first frame EOFError, # got header but not the first frame
struct.error, struct.error,
) as v: ) as v:
raise SyntaxError(v) raise SyntaxError(v) from v
if not self.mode or self.size[0] <= 0: if not self.mode or self.size[0] <= 0:
raise SyntaxError("not identified by this driver") raise SyntaxError("not identified by this driver")
@ -241,12 +241,12 @@ class ImageFile(Image.Image):
while True: while True:
try: try:
s = read(self.decodermaxblock) s = read(self.decodermaxblock)
except (IndexError, struct.error): except (IndexError, struct.error) as e:
# truncated png/gif # truncated png/gif
if LOAD_TRUNCATED_IMAGES: if LOAD_TRUNCATED_IMAGES:
break break
else: else:
raise OSError("image file is truncated") raise OSError("image file is truncated") from e
if not s: # truncated jpeg if not s: # truncated jpeg
if LOAD_TRUNCATED_IMAGES: if LOAD_TRUNCATED_IMAGES:
@ -505,7 +505,7 @@ def _save(im, fp, tile, bufsize=0):
try: try:
fh = fp.fileno() fh = fp.fileno()
fp.flush() fp.flush()
except (AttributeError, io.UnsupportedOperation): except (AttributeError, io.UnsupportedOperation) as e:
# compress to Python file-compatible object # compress to Python file-compatible object
for e, b, o, a in tile: for e, b, o, a in tile:
e = Image._getencoder(im.mode, e, a, im.encoderconfig) e = Image._getencoder(im.mode, e, a, im.encoderconfig)
@ -522,7 +522,7 @@ def _save(im, fp, tile, bufsize=0):
if s: if s:
break break
if s < 0: if s < 0:
raise OSError("encoder error %d when writing image file" % s) raise OSError("encoder error %d when writing image file" % s) from e
e.cleanup() e.cleanup()
else: else:
# slight speedup: compress to real file object # slight speedup: compress to real file object

View File

@ -411,10 +411,10 @@ class Color3DLUT(MultibandFilter):
def _check_size(size): def _check_size(size):
try: try:
_, _, _ = size _, _, _ = size
except ValueError: except ValueError as e:
raise ValueError( raise ValueError(
"Size should be either an integer or a tuple of three integers." "Size should be either an integer or a tuple of three integers."
) ) from e
except TypeError: except TypeError:
size = (size, size, size) size = (size, size, size)
size = [int(x) for x in size] size = [int(x) for x in size]

View File

@ -503,8 +503,8 @@ class FreeTypeFont:
""" """
try: try:
names = self.font.getvarnames() names = self.font.getvarnames()
except AttributeError: except AttributeError as e:
raise NotImplementedError("FreeType 2.9.1 or greater is required") raise NotImplementedError("FreeType 2.9.1 or greater is required") from e
return [name.replace(b"\x00", b"") for name in names] return [name.replace(b"\x00", b"") for name in names]
def set_variation_by_name(self, name): def set_variation_by_name(self, name):
@ -533,8 +533,8 @@ class FreeTypeFont:
""" """
try: try:
axes = self.font.getvaraxes() axes = self.font.getvaraxes()
except AttributeError: except AttributeError as e:
raise NotImplementedError("FreeType 2.9.1 or greater is required") raise NotImplementedError("FreeType 2.9.1 or greater is required") from e
for axis in axes: for axis in axes:
axis["name"] = axis["name"].replace(b"\x00", b"") axis["name"] = axis["name"].replace(b"\x00", b"")
return axes return axes
@ -546,8 +546,8 @@ class FreeTypeFont:
""" """
try: try:
self.font.setvaraxes(axes) self.font.setvaraxes(axes)
except AttributeError: except AttributeError as e:
raise NotImplementedError("FreeType 2.9.1 or greater is required") raise NotImplementedError("FreeType 2.9.1 or greater is required") from e
class TransposedFont: class TransposedFont:

View File

@ -57,8 +57,8 @@ class _Operand:
im1.load() im1.load()
try: try:
op = getattr(_imagingmath, op + "_" + im1.mode) op = getattr(_imagingmath, op + "_" + im1.mode)
except AttributeError: except AttributeError as e:
raise TypeError("bad operand type for '%s'" % op) raise TypeError("bad operand type for '%s'" % op) from e
_imagingmath.unop(op, out.im.id, im1.im.id) _imagingmath.unop(op, out.im.id, im1.im.id)
else: else:
# binary operation # binary operation
@ -85,8 +85,8 @@ class _Operand:
im2.load() im2.load()
try: try:
op = getattr(_imagingmath, op + "_" + im1.mode) op = getattr(_imagingmath, op + "_" + im1.mode)
except AttributeError: except AttributeError as e:
raise TypeError("bad operand type for '%s'" % op) raise TypeError("bad operand type for '%s'" % op) from e
_imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id) _imagingmath.binop(op, out.im.id, im1.im.id, im2.im.id)
return _Operand(out) return _Operand(out)

View File

@ -97,13 +97,13 @@ class ImagePalette:
if isinstance(color, tuple): if isinstance(color, tuple):
try: try:
return self.colors[color] return self.colors[color]
except KeyError: except KeyError as e:
# allocate new color slot # allocate new color slot
if isinstance(self.palette, bytes): if isinstance(self.palette, bytes):
self.palette = bytearray(self.palette) self.palette = bytearray(self.palette)
index = len(self.colors) index = len(self.colors)
if index >= 256: if index >= 256:
raise ValueError("cannot allocate more than 256 colors") raise ValueError("cannot allocate more than 256 colors") from e
self.colors[color] = index self.colors[color] = index
self.palette[index] = color[0] self.palette[index] = color[0]
self.palette[index + 256] = color[1] self.palette[index + 256] = color[1]

View File

@ -38,8 +38,8 @@ class Iterator:
try: try:
self.im.seek(ix) self.im.seek(ix)
return self.im return self.im
except EOFError: except EOFError as e:
raise IndexError # end of sequence raise IndexError from e # end of sequence
def __iter__(self): def __iter__(self):
return self return self
@ -49,8 +49,8 @@ class Iterator:
self.im.seek(self.position) self.im.seek(self.position)
self.position += 1 self.position += 1
return self.im return self.im
except EOFError: except EOFError as e:
raise StopIteration raise StopIteration from e
def all_frames(im, func=None): def all_frames(im, func=None):

View File

@ -118,8 +118,8 @@ class IptcImageFile(ImageFile.ImageFile):
# compression # compression
try: try:
compression = COMPRESSION[self.getint((3, 120))] compression = COMPRESSION[self.getint((3, 120))]
except KeyError: except KeyError as e:
raise OSError("Unknown IPTC image compression") raise OSError("Unknown IPTC image compression") from e
# tile # tile
if tag == (8, 10): if tag == (8, 10):

View File

@ -503,13 +503,13 @@ def _getmp(self):
file_contents.seek(info.next) file_contents.seek(info.next)
info.load(file_contents) info.load(file_contents)
mp = dict(info) mp = dict(info)
except Exception: except Exception as e:
raise SyntaxError("malformed MP Index (unreadable directory)") raise SyntaxError("malformed MP Index (unreadable directory)") from e
# it's an error not to have a number of images # it's an error not to have a number of images
try: try:
quant = mp[0xB001] quant = mp[0xB001]
except KeyError: except KeyError as e:
raise SyntaxError("malformed MP Index (no number of images)") raise SyntaxError("malformed MP Index (no number of images)") from e
# get MP entries # get MP entries
mpentries = [] mpentries = []
try: try:
@ -545,8 +545,8 @@ def _getmp(self):
mpentry["Attribute"] = mpentryattr mpentry["Attribute"] = mpentryattr
mpentries.append(mpentry) mpentries.append(mpentry)
mp[0xB002] = mpentries mp[0xB002] = mpentries
except KeyError: except KeyError as e:
raise SyntaxError("malformed MP Index (bad MP Entry)") raise SyntaxError("malformed MP Index (bad MP Entry)") from e
# Next we should try and parse the individual image unique ID list; # Next we should try and parse the individual image unique ID list;
# we don't because I've never seen this actually used in a real MPO # we don't because I've never seen this actually used in a real MPO
# file and so can't test it. # file and so can't test it.
@ -610,8 +610,8 @@ def _save(im, fp, filename):
try: try:
rawmode = RAWMODE[im.mode] rawmode = RAWMODE[im.mode]
except KeyError: except KeyError as e:
raise OSError("cannot write mode %s as JPEG" % im.mode) raise OSError("cannot write mode %s as JPEG" % im.mode) from e
info = im.encoderinfo info = im.encoderinfo
@ -663,8 +663,8 @@ def _save(im, fp, filename):
for line in qtables.splitlines() for line in qtables.splitlines()
for num in line.split("#", 1)[0].split() for num in line.split("#", 1)[0].split()
] ]
except ValueError: except ValueError as e:
raise ValueError("Invalid quantization table") raise ValueError("Invalid quantization table") from e
else: else:
qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)] qtables = [lines[s : s + 64] for s in range(0, len(lines), 64)]
if isinstance(qtables, (tuple, list, dict)): if isinstance(qtables, (tuple, list, dict)):
@ -679,8 +679,8 @@ def _save(im, fp, filename):
if len(table) != 64: if len(table) != 64:
raise TypeError raise TypeError
table = array.array("B", table) table = array.array("B", table)
except TypeError: except TypeError as e:
raise ValueError("Invalid quantization table") raise ValueError("Invalid quantization table") from e
else: else:
qtables[idx] = list(table) qtables[idx] = list(table)
return qtables return qtables

View File

@ -46,8 +46,8 @@ class MicImageFile(TiffImagePlugin.TiffImageFile):
try: try:
self.ole = olefile.OleFileIO(self.fp) self.ole = olefile.OleFileIO(self.fp)
except OSError: except OSError as e:
raise SyntaxError("not an MIC file; invalid OLE file") raise SyntaxError("not an MIC file; invalid OLE file") from e
# find ACI subfiles with Image members (maybe not the # find ACI subfiles with Image members (maybe not the
# best way to identify MIC files, but what the... ;-) # best way to identify MIC files, but what the... ;-)
@ -77,8 +77,8 @@ class MicImageFile(TiffImagePlugin.TiffImageFile):
return return
try: try:
filename = self.images[frame] filename = self.images[frame]
except IndexError: except IndexError as e:
raise EOFError("no such frame") raise EOFError("no such frame") from e
self.fp = self.ole.openstream(filename) self.fp = self.ole.openstream(filename)

View File

@ -116,8 +116,8 @@ class MspDecoder(ImageFile.PyDecoder):
rowmap = struct.unpack_from( rowmap = struct.unpack_from(
"<%dH" % (self.state.ysize), self.fd.read(self.state.ysize * 2) "<%dH" % (self.state.ysize), self.fd.read(self.state.ysize * 2)
) )
except struct.error: except struct.error as e:
raise OSError("Truncated MSP file in row map") raise OSError("Truncated MSP file in row map") from e
for x, rowlen in enumerate(rowmap): for x, rowlen in enumerate(rowmap):
try: try:
@ -142,8 +142,8 @@ class MspDecoder(ImageFile.PyDecoder):
img.write(row[idx : idx + runcount]) img.write(row[idx : idx + runcount])
idx += runcount idx += runcount
except struct.error: except struct.error as e:
raise OSError("Corrupted MSP file in row %d" % x) raise OSError("Corrupted MSP file in row %d" % x) from e
self.set_as_raw(img.getvalue(), ("1", 0, 1)) self.set_as_raw(img.getvalue(), ("1", 0, 1))

View File

@ -131,8 +131,8 @@ def _save(im, fp, filename):
try: try:
version, bits, planes, rawmode = SAVE[im.mode] version, bits, planes, rawmode = SAVE[im.mode]
except KeyError: except KeyError as e:
raise ValueError("Cannot save %s images as PCX" % im.mode) raise ValueError("Cannot save %s images as PCX" % im.mode) from e
# bytes per plane # bytes per plane
stride = (im.size[0] * bits + 7) // 8 stride = (im.size[0] * bits + 7) // 8

View File

@ -168,8 +168,10 @@ class ChunkStream:
crc2 = i32(self.fp.read(4)) crc2 = i32(self.fp.read(4))
if crc1 != crc2: if crc1 != crc2:
raise SyntaxError("broken PNG file (bad header checksum in %r)" % cid) raise SyntaxError("broken PNG file (bad header checksum in %r)" % cid)
except struct.error: except struct.error as e:
raise SyntaxError("broken PNG file (incomplete checksum in %r)" % cid) raise SyntaxError(
"broken PNG file (incomplete checksum in %r)" % cid
) from e
def crc_skip(self, cid, data): def crc_skip(self, cid, data):
"""Read checksum. Used if the C module is not present""" """Read checksum. Used if the C module is not present"""
@ -186,8 +188,8 @@ class ChunkStream:
while True: while True:
try: try:
cid, pos, length = self.read() cid, pos, length = self.read()
except struct.error: except struct.error as e:
raise OSError("truncated PNG file") raise OSError("truncated PNG file") from e
if cid == endchunk: if cid == endchunk:
break break
@ -737,9 +739,9 @@ class PngImageFile(ImageFile.ImageFile):
for f in range(self.__frame + 1, frame + 1): for f in range(self.__frame + 1, frame + 1):
try: try:
self._seek(f) self._seek(f)
except EOFError: except EOFError as e:
self.seek(last_frame) self.seek(last_frame)
raise EOFError("no more images in APNG file") raise EOFError("no more images in APNG file") from e
def _seek(self, frame, rewind=False): def _seek(self, frame, rewind=False):
if frame == 0: if frame == 0:
@ -1168,8 +1170,8 @@ def _save(im, fp, filename, chunk=putchunk, save_all=False):
# get the corresponding PNG mode # get the corresponding PNG mode
try: try:
rawmode, mode = _OUTMODES[mode] rawmode, mode = _OUTMODES[mode]
except KeyError: except KeyError as e:
raise OSError("cannot write mode %s as PNG" % mode) raise OSError("cannot write mode %s as PNG" % mode) from e
# #
# write minimal PNG file # write minimal PNG file

View File

@ -144,8 +144,8 @@ class PsdImageFile(ImageFile.ImageFile):
self.frame = layer self.frame = layer
self.fp = self.__fp self.fp = self.__fp
return name, bbox return name, bbox
except IndexError: except IndexError as e:
raise EOFError("no such layer") raise EOFError("no such layer") from e
def tell(self): def tell(self):
# return layer number (0=image, 1..max=layers) # return layer number (0=image, 1..max=layers)

View File

@ -111,8 +111,8 @@ class SpiderImageFile(ImageFile.ImageFile):
hdrlen = isSpiderHeader(t) hdrlen = isSpiderHeader(t)
if hdrlen == 0: if hdrlen == 0:
raise SyntaxError("not a valid Spider file") raise SyntaxError("not a valid Spider file")
except struct.error: except struct.error as e:
raise SyntaxError("not a valid Spider file") raise SyntaxError("not a valid Spider file") from e
h = (99,) + t # add 1 value : spider header index starts at 1 h = (99,) + t # add 1 value : spider header index starts at 1
iform = int(h[5]) iform = int(h[5])

View File

@ -167,8 +167,8 @@ def _save(im, fp, filename):
try: try:
rawmode, bits, colormaptype, imagetype = SAVE[im.mode] rawmode, bits, colormaptype, imagetype = SAVE[im.mode]
except KeyError: except KeyError as e:
raise OSError("cannot write mode %s as TGA" % im.mode) raise OSError("cannot write mode %s as TGA" % im.mode) from e
if "rle" in im.encoderinfo: if "rle" in im.encoderinfo:
rle = im.encoderinfo["rle"] rle = im.encoderinfo["rle"]

View File

@ -1117,8 +1117,8 @@ class TiffImageFile(ImageFile.ImageFile):
) )
try: try:
decoder.setimage(self.im, extents) decoder.setimage(self.im, extents)
except ValueError: except ValueError as e:
raise OSError("Couldn't set the image") raise OSError("Couldn't set the image") from e
close_self_fp = self._exclusive_fp and not self.is_animated close_self_fp = self._exclusive_fp and not self.is_animated
if hasattr(self.fp, "getvalue"): if hasattr(self.fp, "getvalue"):
@ -1231,9 +1231,9 @@ class TiffImageFile(ImageFile.ImageFile):
logger.debug("format key: {}".format(key)) logger.debug("format key: {}".format(key))
try: try:
self.mode, rawmode = OPEN_INFO[key] self.mode, rawmode = OPEN_INFO[key]
except KeyError: except KeyError as e:
logger.debug("- unsupported format") logger.debug("- unsupported format")
raise SyntaxError("unknown pixel mode") raise SyntaxError("unknown pixel mode") from e
logger.debug("- raw mode: {}".format(rawmode)) logger.debug("- raw mode: {}".format(rawmode))
logger.debug("- pil mode: {}".format(self.mode)) logger.debug("- pil mode: {}".format(self.mode))
@ -1400,8 +1400,8 @@ def _save(im, fp, filename):
try: try:
rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode] rawmode, prefix, photo, format, bits, extra = SAVE_INFO[im.mode]
except KeyError: except KeyError as e:
raise OSError("cannot write mode %s as TIFF" % im.mode) raise OSError("cannot write mode %s as TIFF" % im.mode) from e
ifd = ImageFileDirectory_v2(prefix=prefix) ifd = ImageFileDirectory_v2(prefix=prefix)