I need to implement some function and I would like to report about a fail made inside a function. If function doesn't fail I need to get a some result (for example, std::string
). I see two ways to implement function:
// 1. report with exception std::string foo() { std::string ret; ... // solving str if (is_fail()) throw ...; return ret; } // 2. report with return value bool foo(const std::string &str) { ... // solving str return is_fail(); }
What way is more preferable and why? Or, maybe, there is the best way I didn't write?
The following is the original code for both cases.
namespace fs = boost::filesystem;
namespace po = boost::program_options;
/////////////////////////////////////////////////
// 1. report with exception
fs::path parse(int argc, char *argv[]) {
fs::path ret;
po:options_description desc("Program options");
desc.add_options()
("help,h", "Show help")
("output,o", po::value<fs::path>(&ret), "Output folder")
;
po::variables_map vm;
const po::parsed_options opts = po::command_line_parser(argc, argv).options(desc).run();
po::store(opts, vm);
...
return ret;
}
int main(int argc, char *argv[]) {
fs::path output;
try {
output = parse(argc, argv);
} catch (const std::exception &e) {
cout << e.what() << std::endl;
return 1;
}
...
}
//////////////////////////////////////////////////////
// 2. report with return value
bool parse(int argc, char *argv[], fs::path &output) {
po:options_description desc("Program options");
desc.add_options()
("help,h", "Show help")
("output,o", po::value<fs::path>(&output), "Output folder")
;
po::variables_map vm;
try {
const po::parsed_options opts = po::command_line_parser(argc, argv).options(desc).run();
po::store(opts, vm);
} catch (const std::exception &e) {
cout << e.what() << endl;
return false;
}
...
return true;
}
int main(int argc, char *argv[]) {
fs::path output;
if (!parse(argc, argv, output))
return 1;
...
}
Actually speed is not critical here and parse
function performs just once. Maybe, there is not big deal to choose right answer. However, I would like to know what good practice is.