Tracing OCAML fatal error

What I understand from your example in Today's trick : memory limits with Gc alarms is that Out_of_memory is raised after memory is occupied after the specified limit is reached.

So, is this just to find out where exactly the error has been raised?
In the finally block, heap compaction is requested. So, can’t we resume the operation after shrinking the heap? Instead of just throwing Out_of_memory exception?