We already discussed this a bit on IRC;
But… Let me talk a bit about this from a purely technical perspective of expressive power why this statement is factually incorrect or at least misleading to say “a lot richer”.
Let’s start by calling label-break-value + try {..} mechanisms with the special label 'try as Proposal A and the main proposal in this thread Proposal B.
We can technically include 'try in A because try becomes a reserved keyword. This magical label 'try refers to the innermost try {..} or the enclosing closure / function if there’s no try {..}.
There’s only one difference in expressive power assuming try {..} blocks Ok-wrap.
Even so, ok!(expr) can easily substitute for Ok(expr) at the tail expanding to break 'try Ok(expr).
If they do not Ok-wrap, then the sum total of proposal A is more powerful than proposal B because of the type based reasoning only the compiler could do (but doesn’t have to, if we don’t want it to…) whereas macros only work on token trees.
The 'try label let’s you target it with break 'try expr which can be wrapped in macros to implement the macro based mechanisms you discuss. Most of these mechanisms are also some form of succeed!(expr) or fail!(expr) + extra behavior on top so given fail expr, you could use it as a primitive for macros.
Ostensibly, one difference where try { .. } is more constrained is that it requires the resulting expression to implement Try;
Now that I’ve gotten the more technical aspects out of the way; let me discuss some more subjective points.
Getting back to the Try trait from my subjective POV, I think most cases where you want to bubble up have the Try trait semantics in some form (maybe more general with @scottmcm’s work…)
My preference is that this should be opt-out rather than opt-in.
I do think that try { .. } should be idiomatic.
I find unfamiliarity with try { .. } and throw expr to be unlikely despite differences in operational semantics and typing rules.
I don’t think that is an accurate description; 'escape constitutes a magical label that adds to the language.
I also think that the form 'escape: { .. } is much too subtle for such important control flow and inconsistent with the language at large for the moment; I understand that it is meant to be hidden under a macro; but at this point, you are just eventually reinventing try { .. }.
I also think that the rules for try { .. } are pretty well discussed by now; the remaining point of contention seems to be Ok-wrapping.