如果语言不支持析构函数,如何对堆栈展开做出反应?

时间:2010-10-07 08:05:26

标签: java raii stack-unwinding squirrel

假设您已创建Window类的实例。该窗口显示给用户。然后,抛出异常,并且对实例的引用丢失,但是用户仍然可以看到该窗口,因为该实例仍然存在(它不再被引用)。

在这种情况下该怎么办?

我特别谈到Squirrel脚本语言(http://www.squirrel-lang.org/)。与Java相反,它似乎没有finally块或终结器方法,因此用这种语言打破了异常处理吗?

1 个答案:

答案 0 :(得分:0)

我不知道松鼠,但即使没有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块将异常存储在一个变量中,如果你想重新抛出它,可以稍后测试它,它仍然允许你有机会进行其他清理。显然你必须要注意细微差别(例如需要特殊处理的显式异常,在try / catch之外抛出更多异常)但仔细考虑你应该没问题。

系统资源(如图形句柄,套接字,窗口,文件句柄等)尤其在Java和其他垃圾收集语言中往往有点混乱。通常这些资源将由具有显式close()方法的类管理。所以如果你知道事情已经堆积在一堆中,你通常会在对象上调用一个显式的close()来直接清理它们。否则,对象将在最终确定期间自行清理,但仅限于GC可能需要很长时间才能完成。