2010-10-07 79 views
3

假设您已创建Window类的实例。窗口显示给用户。然后抛出一个异常,并且对该实例的引用丢失,但该窗口仍然被用户看到,因为该实例仍然存在(它不再被引用)。当语言不支持析构函数时,如何应对堆栈展开?

在这些情况下该怎么办?

我特别提到了Squirrel脚本语言(http://www.squirrel-lang.org/)。与Java相反,它似乎没有finally块或终结器方法,那么在此语言中异常处理是否被破坏?

回答

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期间才会自行清理。

+0

有道理。只有在重新抛出异常时才会出现问题(在这种情况下,代码不会到达'if'语句)。顺便说一下,即使没有抛出异常,Java中的'finally'也会被调用,所以它不会是我想要的。原来你的方法比'finally'更有用。 *叹息* C++/C++ 0x的内存管理。 – 2010-10-07 09:10:46