假设您已经创建了一个Window
类的实例。该窗口显示给用户。然后,抛出异常,对实例的引用丢失,但用户仍然可以看到窗口,因为实例仍然存在(只是不再被引用)。
在这些情况下该怎么办?
我专门讨论的是 Squirrel 脚本语言 (http://www.squirrel-lang.org/)。与Java相反,它似乎没有finally
块或终结器方法,那么这种语言中的异常处理是否被破坏了?
假设您已经创建了一个Window
类的实例。该窗口显示给用户。然后,抛出异常,对实例的引用丢失,但用户仍然可以看到窗口,因为实例仍然存在(只是不再被引用)。
在这些情况下该怎么办?
我专门讨论的是 Squirrel 脚本语言 (http://www.squirrel-lang.org/)。与Java相反,它似乎没有finally
块或终结器方法,那么这种语言中的异常处理是否被破坏了?
我不知道 squirrel,但即使没有 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 期间清理,这可能需要很长时间。