fix(script): a script that throws anything at all exits 1

RunScript caught std::exception only. Anything else a script threw went
on across the project.so boundary, and crafter-build ended in
std::terminate instead of reporting the script's failure.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Jorijn van der Graaf 2026-10-20 19:08:12 +02:00
commit 959c65dbb2
Signed by: jorijnvdgraaf
GPG key ID: 2937E59CDCC1BCFB
2 changed files with 6 additions and 0 deletions

View file

@ -96,5 +96,9 @@ returned; ctx.args holds the arguments.)msg");
Progress::Clear(); Progress::Clear();
std::println(std::cerr, "script '{}' failed: {}", found->name, e.what()); std::println(std::cerr, "script '{}' failed: {}", found->name, e.what());
return 1; return 1;
} catch (...) {
Progress::Clear();
std::println(std::cerr, "script '{}' failed: it threw something that isn't a std::exception", found->name);
return 1;
} }
} }

View file

@ -120,6 +120,8 @@ int main() {
Configuration cfg; Configuration cfg;
cfg.scripts.push_back({"throws", [](ScriptContext&) -> std::int32_t { throw std::runtime_error("no such tool"); }}); cfg.scripts.push_back({"throws", [](ScriptContext&) -> std::int32_t { throw std::runtime_error("no such tool"); }});
Check(RunScript(cfg, {.name = "throws", .named = true}) == 1, "a throwing script exits 1"); Check(RunScript(cfg, {.name = "throws", .named = true}) == 1, "a throwing script exits 1");
cfg.scripts.push_back({"throwsInt", [](ScriptContext&) -> std::int32_t { throw 7; }});
Check(RunScript(cfg, {.name = "throwsInt", .named = true}) == 1, "and so does one throwing something that isn't a std::exception");
} }
// Declarations that cannot work are refused before anything runs, also // Declarations that cannot work are refused before anything runs, also