in reply to Which incarnation of try/catch to use?

It's not obvious what you mean by "eval { } can't do that". Every try/catch implementation is implemented by eval { } either directly or using the same internals. If eval { } can't do the job you need, nothing else will be able to.

For a non-eval solution, I'd recommend the core "try" feature, although it is currently experimental. It's certainly more ergonomic than eval, and avoids some pitfalls regarding unusual exception objects.