CommandLineParser: throw on programmer error

requesting a previously undeclared key is most likely an programming
error. e.g. a typo "--unused vs --unsued".
So throw in those cases.

Add an according failure testcase.
This commit is contained in:
Pavel Rojtberg
2015-09-22 12:16:09 +02:00
parent d430e802f2
commit 2ced3ba276
2 changed files with 35 additions and 21 deletions

View File

@@ -37,7 +37,7 @@ struct CommandLineParser::Impl
};
static String get_type_name(int type)
static const char* get_type_name(int type)
{
if( type == Param::INT )
return "int";
@@ -78,14 +78,11 @@ static void from_str(const String& str, int type, void* dst)
else if( type == Param::STRING )
*(String*)dst = str;
else
throw cv::Exception(CV_StsBadArg, "unknown/unsupported parameter type", "", __FILE__, __LINE__);
CV_Error(Error::StsBadArg, "unknown/unsupported parameter type");
if (ss.fail())
{
String err_msg = "can not convert: [" + str +
+ "] to [" + get_type_name(type) + "]";
throw cv::Exception(CV_StsBadArg, err_msg, "", __FILE__, __LINE__);
CV_Error_(Error::StsBadArg, ("can not convert: [%s] to [%s]", str.c_str(), get_type_name(type)));
}
}
@@ -103,23 +100,27 @@ void CommandLineParser::getByName(const String& name, bool space_delete, int typ
if (space_delete)
v = impl->cat_string(v);
// it is an error if we just got the default value here
if (v.empty() && type != Param::STRING)
break;
// the key was neither specified nor has it a default value
if(v.empty() && type != Param::STRING) {
impl->error = true;
impl->error_message = impl->error_message + "Missing parameter: '" + name + "'\n";
return;
}
from_str(v, type, dst);
return;
}
}
}
impl->error = true;
impl->error_message = impl->error_message + "Missing parameter: '" + name + "'\n";
}
catch (Exception& e)
{
impl->error = true;
impl->error_message = impl->error_message + "Parameter '"+ name + "': " + e.err + "\n";
return;
}
CV_Error_(Error::StsBadArg, ("undeclared key '%s' requested", name.c_str()));
}
@@ -134,22 +135,25 @@ void CommandLineParser::getByIndex(int index, bool space_delete, int type, void*
String v = impl->data[i].def_value;
if (space_delete == true) v = impl->cat_string(v);
// it is an error if we just got the default value here
if(v.empty())
break;
// the key was neither specified nor has it a default value
if(v.empty() && type != Param::STRING) {
impl->error = true;
impl->error_message = impl->error_message + format("Missing parameter #%d\n", index);
return;
}
from_str(v, type, dst);
return;
}
}
impl->error = true;
impl->error_message = impl->error_message + "Missing parameter #" + format("%d", index) + "\n";
}
catch(Exception& e)
{
impl->error = true;
impl->error_message = impl->error_message + format("Parameter #%d: ", index) + e.err + "\n";
return;
}
CV_Error_(Error::StsBadArg, ("undeclared position %d requested", index));
}
static bool cmp_params(const CommandLineParserParams & p1, const CommandLineParserParams & p2)
@@ -340,6 +344,8 @@ bool CommandLineParser::has(const String& name) const
}
}
}
CV_Error_(Error::StsBadArg, ("undeclared key '%s' requested", name.c_str()));
return false;
}