web-dev-qa-db-ja.com

例外をスローした後に戻り値が必要ですか(C ++およびC#)

例外を生成する関数があります。たとえば、次のコード:

void test()
{
    ifstream test("c:/afile.txt");
    if(!test)
    { 
         throw exception("can not open file");
    }
    // other section of code that reads from file.
}

例外をスローした後に復帰が必要ですか?

C#の場合はどうですか?

31
mans

throwは通常、関数をすぐに終了させるため、そのコードの後に​​(同じブロック内に)コードを入れても実行されません。これは、C++とC#の両方に当てはまります。ただし、tryブロック内で例外をスローし、例外がキャッチされた場合、実行は適切なcatchブロックで続行され、finallyブロック(C#のみ)、例外がスローされるかどうかに関係なく実行されます。いずれにしても、throwの直後のコードは実行されません。

throw/tryの内部にcatchを直接持つことは通常設計上の問題であることに注意してください。 )

46

厳密に言えば、スローは必ずしもすぐに関数を終了するわけではありません。この場合のように、

try {

     throw new ApplicationException();


} catch (ApplicationException ex) {
    // if not re-thrown, function will continue as normal after the try/catch block

} catch (Exception ex) {

}

そして、最後のブロックがあります-しかし、その後は終了します。

noの場合、戻る必要はありません。

3

いいえ、例外がスローされた後、その後のコードは実行されないため、戻る必要はありません。

2
Oscar

throwを呼び出した後、メソッドはすぐに戻り、それに続くコードは実行されません。これは、例外がスローされ、try / catchブロックでキャッチされない場合にも当てはまります。

0
Belogix

Voidメソッドの場合、復帰命令は必要ありません。

それから、投げる命令の後に何かを置くことはできません

void test()
{
    ifstream test("c:/afile.txt");
    if(!test)
    { 
         throw exception("can not open file");
         // If there is code here it will never be reach !
    }
    // other section of code that reads from file.
    //if you place code here it will be reach only if you don"t throw an exception, so only if test == true in your case
}
0
user2417992