Req #72089 [ReO->Csd]: require() throws fatal error instead of exception

From: Date: Fri, 05 Jun 2020 07:46:55 +0000
Subject: Req #72089 [ReO->Csd]: require() throws fatal error instead of exception
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-227326@lists.php.net to get a copy of this message
Edit report at https://bugs.php.net/bug.php?id=72089&edit=1 ID: 72089 Updated by: nikic@php.net Reported by: paulobitfranca at gmail dot com Summary: require() throws fatal error instead of exception -Status: Re-Opened +Status: Closed Type: Feature/Change Request Package: *General Issues Operating System: Linux PHP Version: 7.0.5 Block user comment: N Private report: N New Comment: Automatic comment on behalf of nikita.ppv@gmail.com Revision: http://git.php.net/?p=php-src.git;a=commit;h=e949f306be9e7d54a700cccd5b9af9711615b43f Log: Fixed bug #72089: Throw Error on require failure Previous Comments: ------------------------------------------------------------------------ [2020-05-29 15:32:11] nikic@php.net Retargeting this FR for only the issue mentioned in OP, namely that require throws a fatal error. Please report separate issues for other fatal errors (after checking that there are no existing ones). Otherwise this is not actionable. I've opened https://github.com/php/php-src/pull/5641 to address require in particular. ------------------------------------------------------------------------ [2017-11-28 20:48:12] ryan dot jentzsch at gmail dot com As an actual case where this issue is a valid concern. Pseudocode that illustrates the issue: <?php try { SoapClient::__constructor($wsdl) } catch (\Throwable $t) { // Never executed because ANYTIME the constructor can not PARSE the WSDL a script exiting fatal is thrown and not caught! // The SOAP implementation in PHP offers ZERO fault tolerance. // We can't degrade gracefully. // All processing stops and the script is exited! // Why in the name of sanity is a SOAP PARSE issue NOT throwing a SOAPFault and instead we get a fatal error? } ------------------------------------------------------------------------ [2017-07-27 21:28:48] spam2 at rhsoft dot net it's a general issue - with having Üeverything* as exception you can esily write code which handles 99.9% of all cases in a very cheap try{] while handle servers missing something in the catch part - unhandeled you get the same result as now but *you can* handle it properly ------------------------------------------------------------------------ [2017-07-27 20:40:24] php at pointpro dot nl By the way, this is issue is linked to PHP 7.0.5, but it also applies to 7.0.21, 7.1.7 and 7.2.0beta1. ------------------------------------------------------------------------ [2017-07-27 20:36:45] php at pointpro dot nl In the same train of thought, why does it make sense that running foo.php, with these contents: ---------- foo.php <?php include "bar.php"; ---------- and ---------- bar.php <?php asdfkoaw jeokjwe foijsdfklojsefwe ---------- Would throw a 'ParseError' exception that can be caught and handled, but when I replace the content of bar.php with the much more correct code: ---------- bar.php <?php class A implements B {} ---------- Gives me a unrecoverable fatal error: Interface 'B' not found. So a very big +1000 on making all failures in requiring files, and basically ALL errors, throw exceptions that can be caught. Even if the script can't continue, it can do its best to provide a meaningful or at least thoughtful error message to the client. ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at https://bugs.php.net/bug.php?id=72089 -- Edit this bug report at https://bugs.php.net/bug.php?id=72089&edit=1

« previous php.bugs (#227326) next »