抛出异常后返回

时间:2010-06-24 12:34:56

标签: c++ exception return-value throw

return异常之后,throw值对于return有什么好处?如果没有,可以省略C4715: not all control paths return a value语句并以某种方式删除编译器错误for (ushort i = 0; i < itsNumUnits; ++i) if (unitFormation[i] == unit) { return unitSetup[i]; } else throw unit; return 0; 吗?

提前致谢。

编辑:(示例代码)

{{1}}

4 个答案:

答案 0 :(得分:7)

抛出异常后无需返回值。如果您遇到此错误,则应检查代码可以访问的路径,而不会抛出异常,例如

if (something)
    throw Exception;
else
    return value;

在“if”的“else”分支中未能返回值会导致编译错误,因为根据something的值可能会抛出异常,也可能不会抛出异常。

答案 1 :(得分:2)

throw本身终止函数执行。但是如果你的函数返回一个值,并且没有抛出异常,你将不得不负责返回一个值。 E.g:

bool foo(bool _flag) throw(...)
{
    if (_flag)
    {
        throw "foo is throwing an exception";
    }
    return true;
}

答案 2 :(得分:0)

能够“返回”一个值以及抛出异常的最接近的等价是当函数在抛出异常之前写入指针或引用的对象时:

void my_func(int& ret)
{
    ret = 0;

    for (ushort i = 0; i < itsNumUnits; ++i) {
        if (unitFormation[i] == unit) {
            ret = unitSetup[i];
            return;
        }
        else {
            throw unit;
        }
    }
}

然而,这种模式容易出错并且很少有用。使用前请仔细考虑。

答案 3 :(得分:-1)

抛出之后你最终陷入了捕获(下面的代码没有被执行)。执行的唯一块是finally。

如果你想实现上面描述的东西,可以选择以下内容:

object returnVal = null; // the bad
try
{
    //some code here
    throw new Exception(); // something bad happened
    //some more code
    returnVal = new object(); // the good
}
catch(Exception ex)
{
    // log, try to recover etc.
    // maybe it`s a good idea not to throw it away if you can handle it here!
}
return returnVal; // either the good or the bad (never the ugly!)

警告的C#等价物是一个编译器错误,所以无论如何我不认为一个好主意是摆脱编译器警告但试图解决它们。

...问候