Use handles to create something whose details are only knowable at run-time. For example, you could create a TEMP-TABLE (sort of like a ADO RecordSet, if you are from .NET) with fields that are determined based on some input that happens at run-time.
Contrast this with static TEMP-TABLEs, whose fields are baked into the code at compile time.
The same idea applies to most things in Progress, eg. buffers, temp-tables, widgets (but notably, not to variables).
Though perhaps there is some matter of opinion here, I'd say handles are much more flexible, at the cost of a higher possibility of run-time errors. You could argue that handles are more verbose and harder to understand, but the former is definitely not always true (the polar opposite is often true) and the latter is really just a matter of familiarity.
Some people love handles, some are terrified of them. My personal opinion is that they're great but should be reserved for situations like I described above, and static should otherwise be preferred. But that's just my opinion!