So I wrote a parser for CSS stylesheets, and as part of its design I used Zig errors as a form of control flow. I thought it would be fine but there’s a problem: it causes the error return trace to grow extremely large (seemingly without bound). Now if the program exits with an error, even after parsing, I get hit with a wall of useless error information, and I’m unable to see the actually important error.
Example error return trace
C:\zss\source\syntax\parse.zig:305:9: 0x7ff6c2d462a7 in pushFrame (zss-unit-tests.exe.obj)
return error.ControlFlowSuspend;
^
C:\zss\source\syntax\parse.zig:360:9: 0x7ff6c2d463fa in pushQualifiedRule (zss-unit-tests.exe.obj)
try parser.pushFrame(.{ .index = index, .data = .{ .qualified_rule = .{ .is_style_rule = is_style_rule } } });
^
C:\zss\source\syntax\parse.zig:459:17: 0x7ff6c2d4688d in consumeListOfRules (zss-unit-tests.exe.obj)
return parser.pushQualifiedRule(ast, saved_location, data.top_level);
^
C:\zss\source\syntax\parse.zig:305:9: 0x7ff6c2d462a7 in pushFrame (zss-unit-tests.exe.obj)
return error.ControlFlowSuspend;
^
C:\zss\source\syntax\parse.zig:378:9: 0x7ff6c2d46c39 in pushStyleBlock (zss-unit-tests.exe.obj)
try parser.pushFrame(.{ .index = index, .data = .{ .style_block = .{} } });
^
C:\zss\source\syntax\parse.zig:518:29: 0x7ff6c2d46ef7 in consumeQualifiedRule (zss-unit-tests.exe.obj)
true => try parser.pushStyleBlock(ast, saved_location),
^
C:\zss\source\syntax\parse.zig:305:9: 0x7ff6c2d462a7 in pushFrame (zss-unit-tests.exe.obj)
return error.ControlFlowSuspend;
^
C:\zss\source\syntax\parse.zig:396:9: 0x7ff6c2d4792f in pushDeclarationValue (zss-unit-tests.exe.obj)
try parser.pushFrame(.{ .index = index, .data = .{ .declaration_value = .{} } });
^
C:\zss\source\syntax\parse.zig:598:17: 0x7ff6c2d47bbd in consumeDeclarationStart (zss-unit-tests.exe.obj)
try parser.pushDeclarationValue(ast, name_location, style_block, previous_declaration);
^
C:\zss\source\syntax\parse.zig:538:29: 0x7ff6c2d486aa in consumeStyleBlockContents (zss-unit-tests.exe.obj)
.token_ident => try consumeDeclarationStart(parser, location, ast, data, saved_location, data.index_of_last_declaration),
^
C:\zss\source\syntax\parse.zig:305:9: 0x7ff6c2d462a7 in pushFrame (zss-unit-tests.exe.obj)
return error.ControlFlowSuspend;
^
C:\zss\source\syntax\parse.zig:396:9: 0x7ff6c2d4792f in pushDeclarationValue (zss-unit-tests.exe.obj)
try parser.pushFrame(.{ .index = index, .data = .{ .declaration_value = .{} } });
^
C:\zss\source\syntax\parse.zig:598:17: 0x7ff6c2d47bbd in consumeDeclarationStart (zss-unit-tests.exe.obj)
try parser.pushDeclarationValue(ast, name_location, style_block, previous_declaration);
^
C:\zss\source\syntax\parse.zig:538:29: 0x7ff6c2d486aa in consumeStyleBlockContents (zss-unit-tests.exe.obj)
.token_ident => try consumeDeclarationStart(parser, location, ast, data, saved_location, data.index_of_last_declaration),
^
C:\zss\source\syntax\parse.zig:305:9: 0x7ff6c2d462a7 in pushFrame (zss-unit-tests.exe.obj)
return error.ControlFlowSuspend;
^
C:\zss\source\syntax\parse.zig:396:9: 0x7ff6c2d4792f in pushDeclarationValue (zss-unit-tests.exe.obj)
try parser.pushFrame(.{ .index = index, .data = .{ .declaration_value = .{} } });
^
C:\zss\source\syntax\parse.zig:598:17: 0x7ff6c2d47bbd in consumeDeclarationStart (zss-unit-tests.exe.obj)
try parser.pushDeclarationValue(ast, name_location, style_block, previous_declaration);
^
C:\zss\source\syntax\parse.zig:538:29: 0x7ff6c2d486aa in consumeStyleBlockContents (zss-unit-tests.exe.obj)
.token_ident => try consumeDeclarationStart(parser, location, ast, data, saved_location, data.index_of_last_declaration),
^
C:\zss\source\syntax\parse.zig:305:9: 0x7ff6c2d462a7 in pushFrame (zss-unit-tests.exe.obj)
return error.ControlFlowSuspend;
^
C:\zss\source\syntax\parse.zig:396:9: 0x7ff6c2d4792f in pushDeclarationValue (zss-unit-tests.exe.obj)
try parser.pushFrame(.{ .index = index, .data = .{ .declaration_value = .{} } });
^
C:\zss\source\syntax\parse.zig:598:17: 0x7ff6c2d47bbd in consumeDeclarationStart (zss-unit-tests.exe.obj)
try parser.pushDeclarationValue(ast, name_location, style_block, previous_declaration);
^
C:\zss\source\syntax\parse.zig:538:29: 0x7ff6c2d486aa in consumeStyleBlockContents (zss-unit-tests.exe.obj)
.token_ident => try consumeDeclarationStart(parser, location, ast, data, saved_location, data.index_of_last_declaration),
^
C:\zss\source\syntax\parse.zig:305:9: 0x7ff6c2d462a7 in pushFrame (zss-unit-tests.exe.obj)
return error.ControlFlowSuspend;
C:\zss\source\syntax\parse.zig:396:9: 0x7ff6c2d4792f in pushDeclarationValue (zss-unit-tests.exe.obj)
try parser.pushFrame(.{ .index = index, .data = .{ .declaration_value = .{} } });
^
C:\zss\source\syntax\parse.zig:598:17: 0x7ff6c2d47bbd in consumeDeclarationStart (zss-unit-tests.exe.obj)
try parser.pushDeclarationValue(ast, name_location, style_block, previous_declaration);
C:\zss\source\syntax\parse.zig:538:29: 0x7ff6c2d486aa in consumeStyleBlockContents (zss-unit-tests.exe.obj)
.token_ident => try consumeDeclarationStart(parser, location, ast, data, saved_location, data.index_of_last_declaration),
^
C:\zss\source\syntax\parse.zig:305:9: 0x7ff6c2d462a7 in pushFrame (zss-unit-tests.exe.obj)
^
C:\zss\source\syntax\parse.zig:396:9: 0x7ff6c2d4792f in pushDeclarationValue (zss-unit-tests.exe.obj)
try parser.pushFrame(.{ .index = index, .data = .{ .declaration_value = .{} } });
^
try parser.pushDeclarationValue(ast, name_location, style_block, previous_declaration);
^
C:\zss\source\syntax\parse.zig:538:29: 0x7ff6c2d486aa in consumeStyleBlockContents (zss-unit-tests.exe.obj)
.token_ident => try consumeDeclarationStart(parser, location, ast, data, saved_location, data.index_of_last_declaration),
C:\zss\source\syntax\parse.zig:305:9: 0x7ff6c2d462a7 in pushFrame (zss-unit-tests.exe.obj)
return error.ControlFlowSuspend;
^
C:\zss\source\syntax\parse.zig:396:9: 0x7ff6c2d4792f in pushDeclarationValue (zss-unit-tests.exe.obj)
try parser.pushFrame(.{ .index = index, .data = .{ .declaration_value = .{} } });
^
(126 additional stack frames skipped...)
Anyone know how to get rid of this large output? Is there a way to “trim/clear” the error return trace? Or should I just stop using errors as control flow?