On Fri, Sep 4, 2026, at 19:51, Tim Düsterhus wrote:
> 2. I disagree with the behavior of not wrapping Exceptions thrown in 
> user callbacks: I believe the correct choice is to throw a 
> \PregException with the Exception thrown in the callback as the 
> `->previous` exception. Not wrapping the user callback exception means 
> that one needs a `catch(Exception)` with a try just around the preg_ 
> call to reliably handle all errors during regular expression execution, 
> which nullifies much of the benefit of having a dedicated exception 
> class in the first place.
> 
> It also violates the exception policy in 
> https://github.com/php/policies/blob/main/coding-standards-and-naming.rst#throwables,
>  
> which states:
> 
> > If an extension uses external functionality that may throw an exception it 
> > MUST wrap any exception thrown by that functionality into an appropriate 
> > exception of its own. It MUST set the $previous property to the original 
> > exception when doing so.

I've read this last week and this interpretation of the exception policy has 
taunted me since then. Tim, I think you are mistaken in your point of view on 
this. I'm not aware of any point where exceptions thrown in user callback 
methods are wrapped, but at least autoloading, a very prominent one, does not. 
https://3v4l.org/vYmts Changing this (in general for all user callbacks)  would 
be a very inconvenient BC break for many projects.

I think this policy should be read differently. I think as a language user you 
should not have to be aware of the implementation of a functions internals. if 
some function is using something that could throw an exception this 
implementation detail should be hidden from the user. Also because if the 
function is re-implemented another way this exception could change. From the 
perspective of the language user, a callable provided to a function is not part 
of the functions internals.

Specifically for this case, wrapping the users' exceptions in this RFC to me is 
very contra-intuïtive because it is inconsistent with other callbacks. Do you 
have an example where this wrapping currently takes place?

Greetings, Casper

Reply via email to