10

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;
4

4 に答える 4

7

例外がスローされた後に値を返す必要はありません。このエラーが発生した場合は、コードが例外をスローせずに到達できるパスを確認する必要があります。

if (something)
    throw Exception;
else
    return value;

"if" の "else" ブランチで値を返さないと、 の値に応じて例外がスローされる場合とスローされない場合があるため、コンパイル エラーが発生しますsomething

于 2010-06-24T12:40:34.993 に答える
2

throw自体が関数の実行を終了します。ただし、関数が値を返し、例外がスローされない場合は、値を返すように注意する必要があります。例えば:

bool foo(bool _flag) throw(...)
{
    if (_flag)
    {
        throw "foo is throwing an exception";
    }
    return true;
}
于 2010-06-24T12:46:17.400 に答える
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;
        }
    }
}

ただし、このパターンはエラーが発生しやすく、ほとんど役に立ちません。使用する前によく考えてください。

于 2010-06-24T18:18:02.490 に答える
-1

throw の後、catch になります (throw の下のコードは実行されません)。実行される唯一のブロックは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#はコンパイラエラーであるため、コンパイラの警告を取り除くことはお勧めできませんが、それらを解決しようとします。

よろしく...

于 2010-06-24T12:50:09.800 に答える