Earlier quoted context omitted.
If you need to distinguish between different errors than a union type like (Result | ErrorA | ErrorB) should be used.
I mean like try if not x() then error end if not y() then error end else // which error happened? end
Looking at your example, I would say, if you care about which error happened, you should be using separate try blocks.
Errors aren't meant for flow control like that so really, you shouldn't be indicating error inside a try like that.
One option that Pony could have gone with is to use union types to always indicate errors:
(My Result | MyError)
There's overhead to that though. You always have to match on the type. For situation where an error is unlikely, partial functions are nice. Partial functions are not exceptions though, and aren't designed to do flow control so trying to use like some might use exceptions (to do flow control) is going to be painful (as your example points out) because they weren't designed for that use case.