I don't know squirrel, but even in the absence of a finally block you could simulate the behaviour to some extent within 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;
}
So the catch block stores the exception in a variable that you can test later if you want to rethrow it, and it still allows you the chance to do other cleanup. Obviously there are nuances that you have to be aware of (e.g. explicit kinds of exception that need special handling, more exceptions being thrown outside the try / catch) but with careful consideration you should be okay.
System resources (like graphics handles, sockets, windows, file handles etc.) in particular tend to be a bit messy in Java and other garbage collected languages. Usually these resources will be managed by a class with an explicit close() method. So if you know things have fallen in a heap you would normally invoke an explicit close() on the objects to clean them up straightaway. Otherwise the object will cleanup itself during finalization but only during GC which could be a long time coming.