7

次のコードがあります。

public static Point operator /(Point point, double value)
    {
        if (value == 0)
        {
            throw new DivideByZeroException("Cannot divide by zero");
            return Point.Origin;
        }
        return new Point(point.X / value, point.Y / value, point.Z / value);
    }

return Point.Origin;Visual Studio では、最初の return ステートメント ( ) に緑色の下線が引かれています。下線付きのテキストの上にカーソルを置くと、「到達不能なコードが検出されました」というメッセージが表示されます。これにより、タイトル行に記載されている私の質問につながります。

メソッド内で例外をスローすると、メソッドは戻りますか?

4

5 に答える 5

9

まあ、それはメソッドの実行を終了させます、はい。例外は、それをキャッチする最も近いメソッドにスタックにスローされます。実行フローに影響がなければ、まったく無意味です。

これは、"通常" を返すメソッドと同じではありません。つまり、例外はありません。したがって、呼び出しメソッドに次のものがあったとします。

Point foo = bar / baz;
Console.WriteLine("Done");

この場合、除算演算子が例外をスローした場合、Console.WriteLine()呼び出しは実行されません。代わりに、例外がこのメソッドでキャッチされる例外がそのメソッドの呼び出し元に伝播します。

(finallyブロックも途中で実行されます。)

「例外の処理とスロー」に関するMSDN ガイドを読む価値はあります。

于 2013-01-14T17:53:16.927 に答える
2

ではない正確に。例外がスローされると、キャッチされた場合、メソッド内の処理コードにジャンプします。そこから、あなたが望むことは何でもできます。あなたの例のようにキャッチされない場合、このメソッドを呼び出したメソッドにジャンプし、値を「返す」ことはありません。また、スローされた例外の後にある戻り行を実行するために戻ることもありません。

于 2013-01-14T17:53:19.387 に答える
2

いいえ、例外のスローはリターンではないためです。

例外が関数内で処理されない場合は、関数がすぐに終了し、例外がキャッチされる、つまり処理されるプログラムの最初のポイントに制御が渡されます。(処理されない場合、プログラムは突然終了します。)

関数はスロー後に終了するため、return ステートメントは到達しないため役に立ちません。

于 2013-01-14T17:56:52.470 に答える
1

メソッド内で例外をスローすると、メソッドは戻りますか?

はい。メソッドの実行が中断されているため、メソッドは実行フローを返します。returnしかし、ステートメントで定義した値は返されません。対応するandブロックthrow newを除いて、現在のメソッドの次の行は実行されていません。したがって、例外をスローした後に値を返す必要はありません。catchfinally

Visual Studio は、アクセスできないことを検出したコード ブロックに下線を付けます。特定のケースでは、 return Point.Origin;ステートメントが実行されることはないため、削除できます。

于 2013-01-14T17:51:49.547 に答える
0

はい、例外をスローすると、メソッドはすぐに戻ります。

ただし、通常のリターンではありません。たとえば、戻り値はありません。スローされた例外の結果として返されるメソッドから制御をキャプチャする唯一の方法は、例外ハンドラを用意することです。

于 2013-01-14T17:53:01.423 に答える