1

throw Exception( ) と ( return value) は Java や C# などの言語でどのように実装されていますか? の使用法だけでなく、そのサポートが言語にどのように含まれているかのメカニズムを知りたいですtry { .... } catch (Exception) {}

関数をいつ呼び出すかを知っています。

public void doSomething() {
  ....
  ....
  return;
}

次に、呼び出しがスタックに置かれ、メソッドが呼び出しを返すと、doSomethingスタックが飛び出します。

return ステートメントが値を返した場合、たとえばreturn 4;、スタック上の への呼び出しがdoSomething()ポップアウトし、Prog カウンターの次のステートメントが処理された場合はどうなりますか? 返された値はどうなりましたか? それはどこに保存され、どのように利用されますか?


同様に、例外スローの場合、throw ex;ステートメントはスタック上で適切なcatchステートメントを見つけ、それが見つかるまで、スタックから何かをポップし続けます... このメカニズムはどのように機能しますか?

4

1 に答える 1

2

この記事を見て、それが役立つかどうかを確認してください。.NET (C#) 例外システムの SEH 基盤について説明しています。

編集:

「C# や Java などでパラメーターと戻り値を使用してメソッドを呼び出す方法」について質問している場合は、この記事を参照してください。

非常に低いレベルで(私があなたが求めていると思っていることです)、メソッドを呼び出すときは、パラメータをスタックにプッシュしてから関数を実行し、スタックの戻り値をレジスタにポップしてから次のように、それを処理します。

  • メソッドから戻る (アセンブリ コード)
  • pop esx- 値をスタックからポップし、EAX レジスタに格納します
  • jz esx A01h- EAX レジスタがゼロの場合、この場所にジャンプします。

編集#2:

例外が発生した場合、マネージ フレームワーク (Java、.NET など) は、エラーを処理できる "catch" または "finally" ブロックを探して、一度に 1 ステップずつスタックの巻き戻しを開始します。それを処理できるコードのブロックが見つかるか、コードが不足してプログラムを終了するまで、これを続けます。これらすべてがスタック レベルでどのように機能するかを理解することは、どのマネージド フレームワークについて話しているかによって異なりますが、上記の最初の記事とこの記事を組み合わせると、より深い見方が得られます。

于 2009-04-21T19:36:57.710 に答える