note 130185 added to function.set-error-handler

From: Date: Mon, 24 Mar 2025 16:01:40 +0000
Subject: note 130185 added to function.set-error-handler
Groups: php.notes 
Request: Send a blank email to php-notes+get-222019@lists.php.net to get a copy of this message
While on this doc/page about PHP's "set_error_handler()", the reader needs to definitely be made aware of "set_exception_handler()", so I am trying to provide that benefit with this post along with a good/simple model to utilize for global error/exception-handling for a page/app that smartly routes how the page/app responds to errors and exceptions. <?php //Below code is written in a PHP 8.3 context. error_reporting(E_ALL); //<--can restrict further/later as desired/needed. ini_set('display_errors', '1'); /* <--Yes, do display errors so can understand what goes wrong prior to getting throwable-handling set up. Once your Throwable-handling is in place, you control what gets displayed despite this setting. */ $in_dev_mode = true; //<--global var to help illustrate implementation. /* Below function is the "global/catch-all" handler of Errors/Exceptions which all originate from class Throwable. */ function my_initial_exception_handler(Throwable $ref_throwable):never{ $err_num = $ref_throwable->getCode(); $err_msg = $ref_throwable->getMessage(); $file_path = $ref_throwable->getFile(); $line_num = $ref_throwable->getLine(); //Log the error regardless of whether in dev-mode... $str_for_logger = "err_msg='{$err_msg}'; file_path='{$file_path}'; err_num='{$err_num}'; line_num='{$line_num}'"; error_log($str_for_logger, 3, "/path/to/error.log"); //But selectively control what goes to screen... global $in_dev_mode; if($in_dev_mode===true){ $str_display_to_browser = <<<GHUJ87TGH <div style="color: red; font-size: x-large;"> err_msg='{$err_msg}' <br> file_path='{$file_path}' <br> err_num='{$err_num}' <br> line_num='{$line_num}' </div> GHUJ87TGH; }else{ $str_display_to_browser = 'Sorry, but an error/exception occurred.'; } echo $str_display_to_browser; exit; } //end fn set_exception_handler('my_initial_exception_handler'); /* --Internal PHP functions mainly use Error reporting, while only modern Object-oriented extensions use exceptions. But...reported-errors can be converted to exceptions using class 'ErrorException' (the technique only works with non-fatal errors). --Recall also that the fn registered using 'set_error_handler()' gets called when fn trigger_error() is called in PHP code, making it essential to have the below 'set_error_handler()' registration and error-reporting conversion in-place. */ set_error_handler( function($severity, $message, $file, $line){ //The below "@noinspection" directive/annotation is optional and spares you from IDE warnings: /** @noinspection PhpUnhandledExceptionInspection */ throw new ErrorException($message, 0, $severity, $file, $line); } ); /* ...and below is where your php page/app begins its work... Once you get your auto-loading set up, or your require() calls in-place to bring in your custom classes, you can call function "set_exception_handler()" again to switch over to your better/more robust handler. */ echo 'Hello World and welcome to my amazing app.'; ?> Know also that if you are "raising errors" in your PHP code, you likely no longer want to do it using "trigger_error()"--but you of course can if you choose, and if you do, the code above handles getting things switch over to a thrown Exception. The new way is to use the newer technique of using: "throw new Exception('error message goes here.');". And do not forget, one may benefit from extending the Exception class with one's own custom Exception class and throwing it instead. ---- Server IP: 45.112.84.4 Probable Submitter: 45.112.84.18 (proxied: 96.60.59.42) ---- Manual Page -- https://php.net/manual/en/function.set-error-handler.php Edit -- https://main.php.net/note/edit/130185 Del: integrated -- https://main.php.net/note/delete/130185/integrated Del: useless -- https://main.php.net/note/delete/130185/useless Del: bad code -- https://main.php.net/note/delete/130185/bad+code Del: spam -- https://main.php.net/note/delete/130185/spam Del: non-english -- https://main.php.net/note/delete/130185/non-english Del: in docs -- https://main.php.net/note/delete/130185/in+docs Del: other reasons-- https://main.php.net/note/delete/130185 Reject -- https://main.php.net/note/reject/130185 Search -- https://main.php.net/manage/user-notes.php

« previous php.notes (#222019) next »