就像标题所说,我无法捕捉到函数抛出的异常。它只是说“在throwin tocccli :: InvalidParametersError *”
的实例后终止调用try{
cmd_parameters = parse_cmd(argc, argv);
}
catch (InvalidParametersError e){
// blablabla
}
抛出异常的函数
std::vector<CmdParam> parse_cmd(int argc, char* argv[]){
for (int i = 1; i < argc; ++i)
{
if (argv[i][0] == '-')
{
//blablala
}
else
{
if (result.empty())
{
throw new InvalidParametersError(
"First parameter have to be an option (e.g. starts with a dash)");
}
result.back().arguments.push_back(argv[i]);
}
}
return result;
}
该函数位于名为tocccli的命名空间内 我错过了什么吗?
答案 0 :(得分:4)
请勿使用new
中的parse_cmd()
关键字:
std::vector<CmdParam> parse_cmd(int argc, char* argv[]){
for (int i = 1; i < argc; ++i)
{
if (argv[i][0] == '-')
{
//blablala
}
else
{
if (result.empty())
{
throw InvalidParametersError( // <-- No new keyword here
"First parameter have to be an option (e.g. starts with a dash)");
}
result.back().arguments.push_back(argv[i]);
}
}
return result;
}
通过const引用捕获:
try{
cmd_parameters = parse_cmd(argc, argv);
}
catch (const InvalidParametersError& e){
// blablabla
}
答案 1 :(得分:3)
您正在抛出指向InvalidParametersError的指针,并按值捕获。考虑将你的投掷改为:
throw InvalidParametersError("First parameter have to be an option (e.g. starts with a dash)");
正如@pmr所指出的,还要考虑使用const ref
try {
cmd_parameters = parse_cmd(argc, argv);
} catch (const InvalidParametersError &e) {
// ....
}
答案 2 :(得分:-2)
只需在catch块中添加&符号,然后在catch块中完成。
catch (InvalidParametersError &e)