From 7c5c03d218b05f1085885677670311a9db766132 Mon Sep 17 00:00:00 2001 From: "Taylor C. Richberger" Date: Tue, 10 May 2016 16:55:10 -0600 Subject: improve error management --- args.hxx | 67 +++++++++++++++++++++++++++++++++++++--------------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/args.hxx b/args.hxx index 4ef5b62..9198afc 100644 --- a/args.hxx +++ b/args.hxx @@ -138,38 +138,49 @@ namespace args return output; } + /** Base error class + */ + class Error : public std::runtime_error + { + public: + Error(const std::string &problem) : std::runtime_error(problem) {} + virtual ~Error() {}; + }; + /** Errors that occur during regular parsing */ - class ParseError : public std::runtime_error + class ParseError : public Error { public: - ParseError(const char *problem) : std::runtime_error(problem) {} + ParseError(const std::string &problem) : Error(problem) {} virtual ~ParseError() {}; }; /** Errors that are detected from group validation after parsing finishes */ - class ValidationError : public std::runtime_error + class ValidationError : public Error { public: - ValidationError(const char *problem) : std::runtime_error(problem) {} + ValidationError(const std::string &problem) : Error(problem) {} virtual ~ValidationError() {}; }; + /** Errors that are caused by invalid use of this library + */ + class UsageError : public Error + { + public: + UsageError(const std::string &problem) : Error(problem) {} + virtual ~UsageError() {}; + }; + /** An exception that indicates that the user has requested help */ - class Help : public std::exception + class Help : public Error { - private: - const std::string flag; public: - Help(const std::string &flag) : flag(flag) {} + Help(const std::string &flag) : Error(flag) {} virtual ~Help() {}; - - virtual const char *what() const noexcept override - { - return flag.c_str(); - } }; /** A simple unified option type for unified initializer lists for the Matcher class. @@ -555,7 +566,7 @@ namespace args * * \return the first ready PosBase pointer, or nullptr if there is no match */ - PosBase *GetNextPos() + PosBase *GetNextPositional() { for (Base *child: children) { @@ -563,7 +574,7 @@ namespace args Group *group = dynamic_cast(child); if (group) { - next = group->GetNextPos(); + next = group->GetNextPositional(); } if (next and next->Ready()) { @@ -1105,7 +1116,7 @@ namespace args { std::ostringstream problem; problem << "Flag '" << arg << "' was passed a joined argument, but these are disallowed"; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } } else { @@ -1114,7 +1125,7 @@ namespace args { std::ostringstream problem; problem << "Flag '" << arg << "' requires an argument but received none"; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } if (allowSeparateLongValue) @@ -1124,20 +1135,20 @@ namespace args { std::ostringstream problem; problem << "Flag '" << arg << "' was passed a separate argument, but these are disallowed"; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } } } else if (separator != argchunk.npos) { std::ostringstream problem; problem << "Passed an argument into a non-argument flag: " << chunk; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } } else { std::ostringstream problem; problem << "Flag could not be matched: " << arg; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } // Check short args } else if (!terminated && chunk.find(shortprefix) == 0 && chunk.size() > shortprefix.size()) @@ -1163,7 +1174,7 @@ namespace args { std::ostringstream problem; problem << "Flag '" << *argit << "' was passed a joined argument, but these are disallowed"; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } } else { @@ -1172,7 +1183,7 @@ namespace args { std::ostringstream problem; problem << "Flag '" << *argit << "' requires an argument but received none"; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } if (allowSeparateShortValue) @@ -1182,7 +1193,7 @@ namespace args { std::ostringstream problem; problem << "Flag '" << *argit << "' was passed a separate argument, but these are disallowed"; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } } // Because this argchunk is done regardless @@ -1192,12 +1203,12 @@ namespace args { std::ostringstream problem; problem << "Flag could not be matched: '" << arg << "'"; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } } } else { - PosBase *pos = GetNextPos(); + PosBase *pos = GetNextPositional(); if (pos) { pos->ParseValue(chunk); @@ -1205,7 +1216,7 @@ namespace args { std::ostringstream problem; problem << "Passed in argument, but no positional arguments were ready to receive it: " << chunk; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } } } @@ -1213,7 +1224,7 @@ namespace args { std::ostringstream problem; problem << "Group validation failed somewhere!"; - throw ValidationError(problem.str().c_str()); + throw ValidationError(problem.str()); } } @@ -1360,7 +1371,7 @@ namespace args { std::ostringstream problem; problem << "Argument '" << name << "' received invalid value type '" << value << "'"; - throw ParseError(problem.str().c_str()); + throw ParseError(problem.str()); } } -- cgit v1.2.1