2

ほとんどすべての言語に見られ、私はほとんどの場合それを使用してきました。それが内部的なものかどうかはわかりませんが、実際にどのように機能するのだろうか.

任意の言語の実行時にネイティブ レベルでどのように機能しますか?

例: try 内で stackoverflow または divisionbyzero が発生した場合、 catch はどのようにしてプログラムの落下を防ぎますか?

4

2 に答える 2

3

「任意の言語の実行時にネイティブ レベルで」というステートメントは矛盾した表現です。例外処理のすべてのネイティブ部分は、言語ではなくプラットフォームに依存します。例外処理の一部は、ハードウェアに依存することさえあります (たとえば、ゼロ除算は常にハードウェア例外です)。

.NET、Windows、x86 でのゼロ除算の特定のケースでは、次のようになります。

  • アプリケーションがゼロ除算を試みます。
  • CPU はアプリケーションの状態を保存し、トラップ テーブルの「Divide Error」アドレスにあるコードを実行します (トラップ テーブルの 0 番目の要素になります)。
  • トラップ ハンドラー コード (Windows カーネルの一部) はメカニズムをトリガーし、最終的に (エグゼクティブで) ゼロ除算の SEH 例外を発生させます。この例外はオブジェクト マネージャーに伝達され、次に .NET ランタイムに伝達されます。
  • mscoree.dll の .NET ランタイム コードは、COM オブジェクトから HRESULT COR_E_DIVIDEBYZERO としてゼロ除算を取得します。
  • .NET は、HRESULT を System.DivideByZeroException に変換します。
  • あなたのコードは、例外を「最も近い」囲んでいる catch ブロックまたは finally ブロックへの美化された長いジャンプとして認識します。
  • 例外を処理するか、コードから伝搬されてアプリケーションがクラッシュします。

一般に、例外は、スレッド ローカルの状態情報 (例外) へのポインターを運ぶロング ジャンプと考えることができます。ロング ジャンプのターゲットは、通常、コンパイル時に認識されます。

すべての言語に例外処理が組み込まれているわけではありません。たとえば、C には構造化された例外処理がありません。

于 2012-06-19T08:30:56.433 に答える
0

例外がスローされ、制御が try ブロックからハンドラーに渡されると、ランタイムは、try ブロックの開始以降に構築されたすべての自動オブジェクトのデストラクターを呼び出します。このプロセスは、スタックの巻き戻しと呼ばれます。

于 2012-05-19T05:17:05.893 に答える