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

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块中.