On Tue, Feb 23, 2021 at 5:12 PM Nikita Popov <nikita....@gmail.com> wrote:
> On Tue, Feb 23, 2021 at 4:52 PM Guilliam Xavier <guilliam.xav...@gmail.com> > wrote: > >> On Fri, Feb 5, 2021 at 2:10 PM G. P. B. <george.bany...@gmail.com> wrote: >> >> > Greetings internals, >> > >> > While working on rewriting the PHP docs about errors and error handling >> [1] >> > I came across a change of behaviour in an edge case of an edge case. >> > >> > finally blocks are meant to be always executed regardless that an >> Exception >> > has been thrown or not, which it does, however a call to exit() (or >> die() >> > as they are aliases). >> > This can be seen with the following example: https://3v4l.org/6Tger >> > >> > However, there is one case where finally blocks are executed when >> exit() is >> > used, namely when a generator has a finally block and exit() is called >> > during its traversal, an example of this in action can be seen here: >> > https://3v4l.org/HGKHS >> > >> > The behaviour of this edge case of an edge case is highly dependent on >> the >> > version of PHP where this is run, PHP 5.5, 5.6, 7.0, early version of >> PHP >> > 7.1, PHP 7.2.0, PHP 7.2.1, and PHP 8.0 all run the finally block on >> exit(). >> > Later versions of PHP 7.1, 7.2.2 and above and PHP 7.3 and 7.4 all skip >> the >> > finally block. >> > >> > Frankly this is already going to be a mess to document, but this begs >> the >> > question is there a "bug" in executing the finally blocks in generators >> > during a call to exit() or is the "bug" to not execute finally blocks >> when >> > exit() is called. >> > >> > I've CCed the PHP 8.0 RMs as if the consensus is that skipping finally >> > blocks after a call to exit() is performed it would be wise to change >> this >> > behaviour in PHP 8.0 only and land this ASAP, even though it's a BC >> break. >> > >> > Interested in hearing your thoughts. >> > >> > Best regards, >> > >> > George P. Banyard >> > >> > [1] https://github.com/php/doc-en/pull/320 >> > >> >> Hello again, >> >> From my message from two weeks ago, my understanding is that finally >> blocks >> are *never* supposed to be executed on exit(), and that there is indeed a >> bug (regression) with generators. >> >> With PHP 8.0.3RC1 having been released without any reply here from the >> people CCed, maybe you should open a bug report? >> > > Finally blocks are intended to be always executed when destructors are > executed. The fact that they are not yet executed for exit() outside > generators is a known bug. (For generators, finally is part of the > destructor, which is why the issue does not appear there.) > > Regards, > Nikita > Thanks for replying. So it seems that I had it all backwards ^^' For the record, this comment may help understanding: https://github.com/php/php-src/pull/5243#issuecomment-598664651 -- Guilliam Xavier