Keep tippecanoe's own errors from being reported as protobuf errors

A tile that fails to decode is reported with EXIT_MVT, while a tile that
protozero throws on is reported with EXIT_PROTOBUF. Now that decoding
failures are raised as a tippecanoe_error rather than exiting on the
spot, the catch that was written for protozero's exceptions catches
tippecanoe's own as well, since tippecanoe_error is a std::exception:
mvt_tile::decode() throwing "Tile decompression failed" came back out as
EXIT_PROTOBUF and "PBF decoding error in tile z/x/y".

Catch tippecanoe_error first at the four places that wrap a decode in a
try. In overzoom() and in tippecanoe-decode it can be rethrown for
main() to report. In tile-join it can't: append_tile() runs on a worker
thread, where an escaping exception would call std::terminate() instead
of exiting, so report it and exit with its own status there.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DuCSVGssWNUCpVEE8Yp5HT
This commit is contained in:
Claude
2026-08-07 18:50:53 +00:00
parent 85547150c2
commit 701389bbc9
4 changed files with 24 additions and 0 deletions
+11
View File
@@ -108,6 +108,12 @@ void append_tile(std::string message, int z, unsigned x, unsigned y, std::map<st
fprintf(stderr, "Couldn't decompress tile %d/%u/%u\n", z, x, y);
exit(EXIT_MVT);
}
} catch (tippecanoe_error &e) {
// a tippecanoe_error is a std::exception, so without this it
// would be caught below and reattributed to protobuf. It can't
// be rethrown either, since this runs on a worker thread.
fprintf(stderr, "%s\n", e.what());
exit(e.exit_code);
} catch (std::exception const &e) {
fprintf(stderr, "PBF decoding error in tile %d/%u/%u\n", z, x, y);
exit(EXIT_MVT);
@@ -749,6 +755,11 @@ struct tileset_reader {
fprintf(stderr, "Couldn't parse tile %lld/%lld/%lld\n", tile.z, tile.x, tile.y);
exit(EXIT_MVT);
}
} catch (tippecanoe_error &e) {
// a tippecanoe_error is a std::exception, so without this
// it would be caught below and reattributed to protobuf
fprintf(stderr, "%s\n", e.what());
exit(e.exit_code);
} catch (std::exception const &e) {
fprintf(stderr, "PBF decoding error in tile %lld/%lld/%lld\n", tile.z, tile.x, tile.y);
exit(EXIT_PROTOBUF);