try {} catch {}
ブロックとスタックのトレースがどのように機能するのかを知りたいですか?`try/catch`はどのように詳細に動作するのですか
私はthis great article about exception handling anti-patternsを読み、次の段落を発見された:
はその後、私はどのようにcatch (NoSuchMethodException e) { throw new MyServiceException("Blah: " + e.getMessage()); }
は、これは元の例外のスタックトレースを破壊し、常に間違っています。
try/catch
作品ではない
が本当に知っていることに気づきました。私の理解は次のとおりです。例を考えてみましょう:
void top() {
try {
f();
} catch (MyException ex) {
handleIt();
} finally {
cleanup();
}
}
void f() {
g();
}
void g() {
throw new MyException();
}
私はtop()
を呼び出すと、呼び出しチェーンtop -> f -> g
は(top
とf
機能のための)コールスタック上の2つのstack framesを残します。 g
で例外が発生すると、 プログラムは例外を処理するブロックtry/catch
が見つかるまで実行スタックをバブルアップします。一方、スタックフレームを解放し、スタックトレース情報をcatch
に渡すことができるいくつかの "マジック"オブジェクトに添付し、スタックトレースを印刷することができます。
呼び出された関数がtry/catchブロックで「囲まれている」ことをどのように知っていますか?この情報はスタックフレームにバインドされていますか?同様に、エラー処理ブロックへのポインタ(一致するcatch
ブロックを選択するスイッチ)と、finally
ブロックへのポインタ?なぜ上記の例ではe.getMessage()
が破壊的なのでしょうか(コメント参照)?
注、私はてみ使用する方法/キャッチし、例外を知っ、私はそれが内に動作します方法を知りたいです。
あなたは正しいです、私は 'スロー'に気づかなかった:)しかし残りの質問はまだ有効です –