Skip to content

Commit 26218d9

Browse files
committed
feat: enhance error handling in Application and add overloaded GetExitCode method
1 parent 702ed2d commit 26218d9

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

cucumber_cpp/library/Application.cpp

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
#include "cucumber_cpp/library/Application.hpp"
22
#include "cucumber_cpp/library/Context.hpp"
3+
#include "cucumber_cpp/library/InternalError.hpp"
34
#include "cucumber_cpp/library/StepRegistry.hpp"
5+
#include "cucumber_cpp/library/cucumber_expression/Errors.hpp"
46
#include "cucumber_cpp/library/engine/ContextManager.hpp"
57
#include "cucumber_cpp/library/engine/FeatureFactory.hpp"
68
#include "cucumber_cpp/library/engine/FeatureInfo.hpp"
@@ -17,7 +19,9 @@
1719
#include <CLI/impl/App_inl.hpp>
1820
#include <CLI/impl/Option_inl.hpp>
1921
#include <algorithm>
22+
#include <exception>
2023
#include <filesystem>
24+
#include <format>
2125
#include <functional>
2226
#include <iostream>
2327
#include <iterator>
@@ -139,7 +143,14 @@ namespace cucumber_cpp::library
139143

140144
runCommand = cli.add_subcommand("run")->parse_complete_callback([this]
141145
{
142-
RunFeatures();
146+
try
147+
{
148+
RunFeatures();
149+
}
150+
catch (std::exception& error)
151+
{
152+
std::cerr << error.what();
153+
}
143154
});
144155

145156
runCommand->add_option("-t,--tag", options.tags, "Cucumber tag expression");
@@ -170,6 +181,24 @@ namespace cucumber_cpp::library
170181
{
171182
return cli.exit(e);
172183
}
184+
catch (const InternalError& error)
185+
{
186+
std::cout << "Internal error:\n\n";
187+
std::cout << error.what() << std::endl;
188+
return GetExitCode(engine::Result::failed);
189+
}
190+
catch (const cucumber_expression::Error& error)
191+
{
192+
std::cout << "Cucumber Expression error:\n\n";
193+
std::cout << error.what() << std::endl;
194+
return GetExitCode(engine::Result::failed);
195+
}
196+
catch (const std::exception& error)
197+
{
198+
std::cout << "Generic error:\n\n";
199+
std::cout << error.what() << std::endl;
200+
return GetExitCode(engine::Result::failed);
201+
}
173202

174203
return GetExitCode();
175204
}
@@ -227,8 +256,11 @@ namespace cucumber_cpp::library
227256

228257
int Application::GetExitCode() const
229258
{
230-
const auto result = static_cast<std::underlying_type_t<engine::Result>>(contextManager.ProgramContext().ExecutionStatus());
231-
return result - static_cast<std::underlying_type_t<engine::Result>>(engine::Result::passed);
259+
return GetExitCode(contextManager.ProgramContext().ExecutionStatus());
232260
}
233261

262+
int Application::GetExitCode(engine::Result result) const
263+
{
264+
return static_cast<std::underlying_type_t<engine::Result>>(result) - static_cast<std::underlying_type_t<engine::Result>>(engine::Result::passed);
265+
}
234266
}

cucumber_cpp/library/Application.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ namespace cucumber_cpp::library
6363

6464
private:
6565
[[nodiscard]] int GetExitCode() const;
66+
[[nodiscard]] int GetExitCode(engine::Result result) const;
6667
void DryRunFeatures();
6768
void RunFeatures();
6869
[[nodiscard]] std::vector<std::unique_ptr<engine::FeatureInfo>> GetFeatureTree(const engine::FeatureTreeFactory& featureTreeFactory, std::string_view tagExpression);

0 commit comments

Comments
 (0)