gpt4 book ai didi

c++ - 抛出异常并从函数返回结果

转载 作者:可可西里 更新时间:2023-11-01 16:30:23 25 4
gpt4 key购买 nike

我刚学 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;
}

我该怎么办?返回一个空 vector ?如果我将异常抛给返回值的接收者会发生什么?

最佳答案

当你抛出一个异常时,函数会在那里停止,然后跳转到捕获到异常的地方执行。您的函数不返回任何内容,因为该函数根本不返回。

你可以这样做

if (avec.empty())
throw domain_error("Cannot operate on empty vector!");

您的函数将在那里退出。

请注意,您无需关心返回值(“函数怎么可能不返回任何内容?”等),因为您无法访问抛出(但未捕获)的函数的返回值即使您尝试也是异常(exception)。

例如,如果你这样做

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
}

如果函数正确返回(即不抛出),您只能访问 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
}

由于函数没有返回,它的返回值赋值给retval并没有发生,retval仍然是一个完全正常的默认构造的vector 你可以自由使用。所以在那个例子中,retval 没有被赋值并且 retval 没有被打印,因为 extract_networking 抛出了一个异常并且执行跳转到了 在这两件事发生之前捕获 block 。

关于c++ - 抛出异常并从函数返回结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9549493/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com