C3 error handling is fairly novel though. It tries to find a sweet spot between composability, explicitness and C compatibility.
The try-catch has nice composability:
try {
int x = foo_may_fail();
int y = bar_may_fail(x);
} catch (... ) {
...
}
Regular Result types need to use flatmap for this, and of course error codes or multiple returns also struggle with this. With C3: int? x = foo_may_fail();
int? y = bar_may_fail(x);
if (catch err = y) {
...
return;
}
// y is implicitly unwrapped to "int" here
This is not to say it would satisfy you. But just to illustrate that it's a novel approach that goes beyond Optional and Either and has a lot in common with try-catch.