56

これは非常に基本的な質問です。Java では、finally ステートメントを使用してリソースを閉じます。「これは良い習慣だからです」。私はJavascriptで開発し、次にNode.jsで数年間開発してきましたが、このステートメントを使用したことはありません。finallyNode.js では、私たち全員が最初のパラメーターのエラー処理パターンに従うことを知っています。とにかく、次の 2 つのスニペットは同じことを行います。

try{
    throw 123
}catch (e){

}finally{
    console.log(1)
}

.

try{
    throw 123
}catch (e){

}

console.log(1)

どちらも 1 を出力します。

finally本当のメリットがないのに、なぜキーワードなのですか? クリーンアップ コードはキャッチ内に配置できます。

4

9 に答える 9

4

oracle docsはこれに対する良い答えを提供します。結論: 最終的に常に呼び出されます! 1 種類の例外 (グローバル キャッチではない) のみをキャッチした場合でも、最終的に呼び出されます (その後、他のキャッチがない場合、アプリケーションはおそらく中断します)。

于 2013-08-15T10:51:40.843 に答える
3

finally ブロックは特別な目的のためのものです。

finally は、例外処理だけでなく、リターン、コンティニュー、またはブレークによってクリーンアップ コードが誤ってバイパスされるのを防ぐことができます。例外が予想されない場合でも、最終ブロックにクリーンアップ コードを配置することは常に良い方法です。

ビジネスロジックに影響を与えないので、メモリ面ではコンパイラフレンドリーです。

于 2013-08-15T10:51:24.203 に答える
1

実行中に例外が発生した場合でも、コードが最後に実行されることを確認したい場合に使用します。

InputStream is = new FileInputStream("C://test.txt");
try {
    //code...
} catch (Exception e) {
    //code...
} finally {
    is.close();
}
于 2013-08-15T10:55:18.700 に答える
1

これはとても良い質問です。

JavaScriptを使用する理由はほとんどありませんfinallyが、実際に使用できる状況は想像できます。

divボタンのクリックなど、何らかのユーザー アクションの後に特定の情報を表示する Web ページがあるとします。たとえば、ユーザーが要求したアクションのログが表示されます
。 アクションが完了した後 (エラーまたはエラーなし)、再度非表示にする必要があります。そのために、句を使用できます。div
divfinally

function doSomething() {
    var d = document.getElementById("log");
    show(d);
    try {
        ... execute action ...
    } catch(e) {
        log(e);
    } finally {
        hide(d);
    }
}

一般的に、あなたが言及したように、エラー コールバックを支持して、例外は JavaScript でますます使用されなくなりました。
ですから、一般的に JavaScript での例外の適切な使用法とは何かを尋ねることもできます。

于 2013-08-15T11:45:14.513 に答える
-1

Java では、catch ブロックの実行と一致しない例外がスローされると、実行が中断され、開いているリソースは開いたままになります。キャッチされない例外が発生した場合でも、finally ブロックは常に実行されます。

于 2013-08-15T10:55:35.547 に答える