1
NodeModularStructureBuilder::NodeSetT const&
NodeModularStructureBuilder::GetSimilarNodesAtLevel ( Node const* p_node,
                                                      size_t level )
{
    if ( p_node ) {
        string s_name = StructuralAnalysis::Util::GetNLevelModularName (
                p_node, level );
        return this->node_ms_map_[s_name]; // this return is fine...
    }

    // if p_node is NULL then throw exception
    throw Except::NullPointerCrash ( "Invalid node pointer passed to "
            "FlopModularStructureBuilder::GetSimilarNodesAtLevel "
            "output is not usable." );
    // return ??????????
}

Q1。为了避免编译器错误,我们需要从上面的函数中返回一些东西。我们应该返回什么?或者建议我如何处理返回引用的成员函数的返回值(在异常上)?

Q2。程序执行会碰到这个返回语句吗?

4

4 回答 4

4

我认为,最简单的方法就是按条件抛出异常。

if (!p_node)
{
    throw Except::NullPointerCrash ( "Invalid node pointer passed to "
            "FlopModularStructureBuilder::GetSimilarNodesAtLevel "
            "output is not usable." );
}

string s_name = StructuralAnalysis::Util::GetNLevelModularName (
     p_node, level );
return this->node_ms_map_[s_name]; // this return is fine...

你也可以使用一些空对象,或者类似boost::optional. 但无论如何,无条件抛出后不会执行任何操作,因此,您的代码中没有错误。

n3376 15.1/2

当抛出异常时,控制权转移到最近的具有匹配类型的处理程序(15.3);“最近的”是指 try 关键字后面的复合语句或 ctor-initializer 最近由控制线程进入但尚未退出的处理程序

于 2013-10-25T06:39:29.083 回答
4

当 you 时throw,该函数不返回任何内容 - 之后的任何代码throw都不会被执行,因此在那里编写任何代码是没有意义的。(正如另一个答案中所建议的,反转条件并在 a 之前抛出return将是避免编译器警告/错误的解决方案)。

显然,调用代码需要注意“不使用从返回值存储的值”,但在这种情况下,这应该不是问题,因为这看起来像一个直接的“糟糕”类型错误——换句话说,没有继续的意义。但是,如果你有这样的事情:

std::String s;
try 
{
    for(;;)
    {
        s = readLineFromFile();
    }
} 
catch (...)
{
    .... 
}
... use s

你会遇到麻烦,因为s可能不是你期望的价值......

于 2013-10-25T06:40:46.753 回答
4

Q1:投掷时不需要返回任何东西。您的代码应该可以无错误地编译。

Q2:不会。大多数编译器都会发出“无法访问代码”的警告。

于 2013-10-25T06:45:03.663 回答
0

在这种情况下,您可以轻松地反转条件:

NodeModularStructureBuilder::NodeSetT const&
NodeModularStructureBuilder::GetSimilarNodesAtLevel ( Node const* p_node,
                                                  size_t level )
{
    if ( ! p_node ) {

        // if p_node is NULL then throw exception
        throw Except::NullPointerCrash ( "Invalid node pointer passed to "
            "FlopModularStructureBuilder::GetSimilarNodesAtLevel "
            "output is not usable." );
    }
    string s_name = StructuralAnalysis::Util::GetNLevelModularName (
        p_node, level );
    return this->node_ms_map_[s_name]; // this return is fine...
}

当你不能做这么简单的事情时,另一个解决方案是使用假的NullObject。但是由于 throw 之后的代码永远不会被调用,所以这在某种程度上是一种浪费。无论如何,了解 NullObject 模式很有用。

于 2013-10-25T06:41:43.140 回答