无法从 C++ 中的函数中捕获异常
can't catch an exception from a function in c++
正如标题所说,我无法捕获函数抛出的异常。它只是说"在抛出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的命名空间中我错过什么了吗?
不要在parse_cmd()
中使用new
关键字:
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
}
您正在抛出指向InvalidParametersError的指针,并按值捕获。考虑将throw更改为:
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) {
// ....
}
只需在要捕获的错误前面添加&号,在catch块中完成。
catch (InvalidParametersError &e)
相关文章:
- 当类定义不可见时捕获异常
- SDL_PollEvent() 无法捕获类函数内部SDL_QUIT?
- 来自 Android 应用程序内部的 boost 类型的 boost::wrapexcept<boost::system::system_error> 的未捕获异常
- 有没有办法捕获 STL 函数未被赋予正确参数的异常?
- C++:如何捕获构造函数引发的异常?
- throw() 函数应该总是在异常时展开堆栈并允许捕获异常还是必须调用 std::terminate ?
- 如何从调用函数中捕获异常
- 捕获类函数引发的异常
- 捕获构造函数抛出的异常似乎是不可能的
- 我应该在哪里捕获构造函数中抛出的C++异常
- C++在构造函数中捕获异常
- 为什么在 main 中未捕获异常时不调用析构函数?
- 无法从 C++ 中的函数中捕获异常
- 从构造函数捕获异常意味着我的实例之后超出了作用域
- 如何:捕获输入函数异常的可变包装函数
- 从自定义sqrt函数捕获异常在c++中失败
- 如何从构造函数中成员的默认初始化中捕获异常
- 如何捕获构造函数异常
- 捕获构造函数异常的RAII方法
- 如何从C++中的构造函数中捕获异常