破壊者が言語でサポートされていない場合、スタック巻き戻しに反応する方法は?

StackOverflow https://stackoverflow.com/questions/3879755

質問

のインスタンスを作成したとします Window クラス。ウィンドウはユーザーに表示されます。次に、例外がスローされ、インスタンスへの参照が失われますが、インスタンスがまだ存在するため、ウィンドウはユーザーによってまだ表示されます(もはや参照されていません)。

これらの状況で何をすべきか?

私は特にリススクリプト言語(http://www.squirrel-lang.org/)について話しています。 Javaに反して、それは持っていないようです finally ブロックまたはファイナルライザーの方法なので、この言語で例外処理が破られていますか?

役に立ちましたか?

解決

私はリスを知りませんが、最終的にブロックがない場合でも、Java内である程度の動作をシミュレートできます。

Exception error = null;
try {
 // do something
}
catch (Exception e) {
  error = e;
}
// My finally code goes here
// ...
if (error != null) {
  // Oh dear clean up all my resources - files, windows, sockets etc.
  throw error;
}

したがって、Catchブロックは、例外を変数に保存します。これにより、後でテストしたい場合は後でテストできます。明らかに、あなたが認識しなければならないニュアンスがあります(例えば、特別な取り扱いが必要な明示的な種類の例外、より多くの例外が試行 /キャッチの外に投げられます)が、慎重に考慮すると大丈夫です。

特に、システムリソース(グラフィックハンドル、ソケット、ウィンドウ、ファイルハンドルなど)は、Javaやその他のゴミ収集言語では少し乱雑になる傾向があります。通常、これらのリソースは、明示的なClose()メソッドを備えたクラスによって管理されます。したがって、物事がヒープに落ちていることを知っていれば、通常、オブジェクトに明示的な近い()を呼び出してすぐに掃除します。それ以外の場合、オブジェクトはファイナライゼーション中に自体をクリーンアップしますが、GC中にのみ長い時間がかかる可能性があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top