I don't really know if it fits here but some weeks ago I was thinking about annotations with "@" prefix and was considering to propose to handle @ (silence operator) similar way as annotations, like:
$value = @ fopen('test.txt','rb+'); might be equivalent to: $value = @SupressError(E_ALL) fopen('test.txt','rb+'); BTW This way I believe it would be easier to parse annotations with '@' prefix in all desired places with one branch inside parser. As well as there will be a place to put supression error level per function/method call with more specific requirements, like: $value = @SupressError(E_ALL ^ E_ERROR) fopen('test.txt','rb+'); Which might work as supress all errors except fatal errors. Does that sound like a solution at all? The developer then has full controll on what errors are supressed or not. Sorry to bother you if it's insane and crazy idea. czw., 29 lis 2018 o 05:44 Fwentish Aelondes <fwent...@gmail.com> napisał(a): > Breaking BC might be unnecessary if instead of changing the default > behavior of @, you add an additional flag to error_reporting that > enables the new behavior, something like E_UNSILENCE_FATAL. Then > developers would only need to switch a flag in php.ini to get the old > behavior back, instead of re-working existing code around the new > behavior. > > On 11/26/18, Nikita Popov <nikita....@gmail.com> wrote: > > Hi internals, > > > > When the silencing operator @ is used, the intention is generally to > > silence expected warnings or notices. However, it currently also silences > > fatal errors. As fatal errors also abort request execution, the result > will > > often be a hard to debug white screen of death. > > > > The most recent occurrence which motivated me to write this mail is > > https://bugs.php.net/bug.php?id=77205, but I've seen this play out > multiple > > times already. > > > > I would like to propose to change the behavior of @ to only silence > > warnings, notices and other low-level diagnostics, but leave fatal errors > > intake. In particular, the following should not be silenced: > > > > * E_ERROR > > * E_CORE_ERROR > > * E_COMPILE_ERROR > > * E_USER_ERROR > > * E_RECOVERABLE_ERROR > > * E_PARSE > > > > This change would have two main implications for backwards compatibility: > > > > 1. Code that legitimately wants to silence fatal errors for whatever > reason > > should now use error_reporting() (or ini_set()) to do so, instead of @. > > > > 2. Error handlers that want to only handle non-silenced errors may have > to > > be adjusted. A common pattern I found in our own tests if checks for > > error_reporting() != 0 to detect silencing. This should be changed to > > error_reporting() & $err_no to detect whether the specific error type is > > silenced. > > > > A preliminary patch for this change is available at > > https://github.com/php/php-src/pull/3685. > > > > What do you think about this? > > > > Nikita > > > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php > > -- regards / pozdrawiam, -- Michał Brzuchalski about.me/brzuchal brzuchalski.com