From c5295d2f162de47a98746d7aa28cb5ccd9a25d97 Mon Sep 17 00:00:00 2001 From: Simon Cozens Date: Thu, 5 Oct 2023 11:09:22 +0100 Subject: [PATCH] Better OTL builder errors (#3286) * Raise a sensible error for keyerror * Try harder to find error locations * Chain exception --- Lib/fontTools/feaLib/builder.py | 13 +++++++++---- Lib/fontTools/otlLib/builder.py | 6 +++++- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/Lib/fontTools/feaLib/builder.py b/Lib/fontTools/feaLib/builder.py index 42d1f8f24..cfaf54d4d 100644 --- a/Lib/fontTools/feaLib/builder.py +++ b/Lib/fontTools/feaLib/builder.py @@ -844,10 +844,15 @@ class Builder(object): feature=None, ) lookups.append(lookup) - try: - otLookups = [l.build() for l in lookups] - except OpenTypeLibError as e: - raise FeatureLibError(str(e), e.location) from e + otLookups = [] + for l in lookups: + try: + otLookups.append(l.build()) + except OpenTypeLibError as e: + raise FeatureLibError(str(e), e.location) from e + except Exception as e: + location = self.lookup_locations[tag][str(l.lookup_index)].location + raise FeatureLibError(str(e), location) from e return otLookups def makeTable(self, tag): diff --git a/Lib/fontTools/otlLib/builder.py b/Lib/fontTools/otlLib/builder.py index 2a02c2004..94628bff1 100644 --- a/Lib/fontTools/otlLib/builder.py +++ b/Lib/fontTools/otlLib/builder.py @@ -55,7 +55,11 @@ def buildCoverage(glyphs, glyphMap): if not glyphs: return None self = ot.Coverage() - self.glyphs = sorted(set(glyphs), key=glyphMap.__getitem__) + try: + self.glyphs = sorted(set(glyphs), key=glyphMap.__getitem__) + except KeyError as e: + raise ValueError(f"Could not find glyph {e} in font") from e + return self