Improved error handling somewhat.
continuous-integration/drone/push Build is passing Details

We now throw exceptions and catch them in main().
This commit is contained in:
tastytea 2019-10-01 11:43:19 +02:00
parent 95e9b19c83
commit 3a42baa24a
Signed by: tastytea
GPG Key ID: CFC39497F1B26E07
1 changed files with 40 additions and 31 deletions

View File

@ -49,9 +49,15 @@ private:
public:
Compilescript();
//! Read settings and set member variables.
void read_settings();
//! Remove files older than `_clean_after_hours` from the cache.
void cleanup();
bool compile(const string &filename, char *argv[]);
//! Compile `filename` if necessary and return filename of binary.
string compile(const string &filename);
//! Run binary. Pass original `argv`, the 1st entry is ignored.
void run(const string &filename, char *argv[]);
//! Print version, copyright and license.
void print_version();
};
@ -139,7 +145,7 @@ void Compilescript::cleanup()
}
}
bool Compilescript::compile(const string &filename, char *argv[])
string Compilescript::compile(const string &filename)
{
const fs::path original = fs::canonical(filename);
const fs::path source = _cache_dir / original;
@ -194,14 +200,14 @@ bool Compilescript::compile(const string &filename, char *argv[])
}
else
{
cerr << "ERROR: Could not open file: " << source << endl;
return false;
throw std::runtime_error("Could not open file: "
+ source.string());
}
}
else
{
cerr << "ERROR: Could not open file: " << original << endl;
return false;
throw std::runtime_error("Could not open file: "
+ original.string());
}
const string command = _compiler + " " + source.string() + " "
@ -209,14 +215,16 @@ bool Compilescript::compile(const string &filename, char *argv[])
int ret = std::system(command.c_str()); // NOLINT Doesn't apply here.
if (ret != 0)
{
cerr << "ERROR: Compilation failed.\n";
return false;
throw std::runtime_error("Compilation failed.");
}
}
execvp(binary.c_str(), &argv[1]); // NOLINT We know that argv[1] exists.
return binary.string();
}
return true;
void Compilescript::run(const string &filename, char *argv[])
{
execvp(filename.c_str(), &argv[1]); // NOLINT We know that argv[1] exists.
}
void Compilescript::print_version()
@ -233,29 +241,30 @@ int main(int argc, char *argv[])
{
const vector<string> args(argv, argv + argc);
Compilescript App;
App.read_settings();
if (args.size() <= 1)
{
cerr << "usage: " << args[0]
<< " [file|--cleanup|--version] [arguments]\n";
return 1;
}
if (args[1] == "--cleanup")
{
App.cleanup();
return 0;
}
if (args[1] == "--version")
{
App.print_version();
return 0;
}
try
{
App.compile(args[1], argv);
Compilescript App;
App.read_settings();
if (args.size() <= 1)
{
cerr << "usage: " << args[0]
<< " [file|--cleanup|--version] [arguments]\n";
return 1;
}
if (args[1] == "--cleanup")
{
App.cleanup();
return 0;
}
if (args[1] == "--version")
{
App.print_version();
return 0;
}
const string binary = App.compile(args[1]);
App.run(binary, argv);
}
catch (const std::exception &e)
{