On Wed, Apr 29, 2026, at 17:04, Larry Garfield wrote:
> On Wed, Apr 29, 2026, at 9:30 AM, Rob Landers wrote:
> > On Wed, Apr 22, 2026, at 20:28, Larry Garfield wrote:
> >> I think a key question to answer here is: Do we care to differentiate 
> >> between CM errors and underlying errors? 
> >
> > I don't think we need to differentiate at the CM level. Suppression is 
> > a policy decision that belongs to the caller, not the context manager. 
> > The CM's job is cleanup: rollback the transaction, close the file, 
> > release the lock, etc. Whether the exception continues propagating 
> > after that is the caller's call, and `try using` already provides 
> > exactly that:
> >
> > try using ($db->transaction() => $conn) {
> >     $conn->execute('INSERT INTO orders ...');
> > } catch (ValidationException $e) {
> >     // Caller chooses to suppress this here
> > }
> >
> > That makes `exitContext()` simple: return void, do your cleanup, and 
> > get out. If cleanup fails, it throws naturally, and the desugared form 
> > can chain the original exception as `$previous` so the root cause isn't 
> > lost. If the caller wants to suppress or differentiate, they already 
> > have `try using` for exactly that.
> >
> > It's worth noting that every example in the RFC (database transactions, 
> > file locks, error handler swaps, async scopes) does cleanup and 
> > propagates. None of them actually need the power to suppress. If a 
> > context manager wants to give callers a clean exception hierarchy to 
> > catch against, it can wrap underlying exceptions in their own types 
> > during cleanup. That's just normal exception design, no special syntax 
> > required.
> >
> > — Rob
> 
> Just to make sure I'm following you, you're arguing that a CM should not have 
> any way at all to suppress an exception?  I don't think I'd agree with that, 
> personally.  Even if it's a rare case, I do believe it's a feature that 
> should remain.

I'd argue CMs are mechanisms, not policies. They encode setup and teardown. 
Suppression is an error-handling policy decision that should be visible at the 
call site, not mixed with the concerns of setting up and tearing down resources.

If CM's could suppress arbitrary exceptions, from a developer stepping over the 
code, they'd see the code randomly appear to jump out of the using block after 
a suppressed exception ... at seemingly arbitrary points. There would be no way 
to trust what you were reading without having the CM's code in front of you as 
well.

— Rob

Reply via email to