Mih*_*ela 9 c++ exception throw
我只是学习C++,并想抛出异常,但是我的函数的结果将是未定义的???
std::vector<myStruct> extract_notworking(std::vector<myStruct>& avec){
std::vector<myStruct> result;
if (avec.size() == 0)
//throw domain_error("Cannot operate on empty vector!");
//Cannot use exception for it would yield undefined result
return result;
//do something here
//...
return result;
}
Run Code Online (Sandbox Code Playgroud)
我该怎么办?返回一个空的向量?如果我将异常抛给返回值的接收器会发生什么?
Set*_*gie 11
抛出异常时,函数会在那里停止并执行跳转到捕获异常的任何位置.您的函数不返回任何内容,因为函数根本不返回.
你可以这样做
if (avec.empty())
throw domain_error("Cannot operate on empty vector!");
Run Code Online (Sandbox Code Playgroud)
你的功能将退出那里.
请注意,您不需要关心返回值("函数如何不返回任何内容?"等),因为您无法访问抛出(并且未捕获)异常的函数的返回值如果你试试.
例如,如果你这样做
try {
std::vector<myStruct> vec;
std::vector<myStruct> retval = extract_notworking(vec);
print_vector(retval); // this line is only executed if extract_networking
// does not throw an exception
} catch (const domain_error& e) {
// we can't access retval here so no worries
}
Run Code Online (Sandbox Code Playgroud)
只有retval在函数正确返回(即不抛出)时才能访问.在这个例子中,你的函数将抛出因为vec是空的,所以print_vector永远不会被调用.
即使你这样做:
std::vector<myStruct> retval;
try {
std::vector<myStruct> vec;
retval = extract_notworking(vec);
print_vector(retval);
} catch (const domain_error& e) {
// we can access retval here but the assignment never happened
}
Run Code Online (Sandbox Code Playgroud)
由于函数没有返回,它的返回值的赋值retval没有发生,并且retval仍然是一个完全正常的默认构造vector,你可以自由使用.所以在那个例子中,retval没有分配和retval不打印,因为在这两件事发生之前extract_networking抛出异常并执行跳转到catch块中.