froot Posted August 27, 2022 Share Posted August 27, 2022 I'm having troubles understanding some basic php… How can I catch errors of nested methods… Do I need to check for the 'error' key in the the $result variable manually? Or like make subMethods1 return true/false and check for that in the topMethod's try block? I still want to return what the error was in the subMethod… class myClass extends WireData {s public function topMethod($item) { $result = []; $result['title'] = $item['title']; try { if ($item['title'] == 'subMethod1') { $array = $this->subMethod1($item); $result = $this->mergeArrays($array, $result); } if ($item['title'] == 'subMethod2') { $array = $this->subMethod2($item); $result = $this->mergeArrays($array, $result); } } catch (WireException $e) { $result['errors'] = $e; } return $result; } protected function subMethod1($item) { try { $result['foo'] = 'bar'; $result['foobar'] = 'foobar'; $result['yada'] = 'blah'; echo $unKnownVariable; // throws error return $result; } catch ($e) { $result['error'] = $e; return $result; } } protected function subMethod2($item) { try { // ... } catch ($e) { // ... } } protected function mergeArrays($array, $result) { foreach ($array as $key => $value) { $result[$key] = $value; } return $result; } } Link to comment Share on other sites More sharing options...
froot Posted August 28, 2022 Author Share Posted August 28, 2022 OK I it looks like I need to catch the exceptions manually, thus evaluate the return values. Anyways, It's easy to throw an error/exception if you know what can go wrong but I cannot anticipate everything that could go wrong so how to catch any type of error? Can I catch internal server errors? Link to comment Share on other sites More sharing options...
flydev Posted August 28, 2022 Share Posted August 28, 2022 (edited) On 8/27/2022 at 2:49 PM, fruid said: } catch ($e) { You must write: `catch(\Exception $e)` as the object must be an instance of the Exception class or of a subclass (see/mean inheritance here) of the Exception class. A must read is this following blog post on Microsoft and then come back with questions if still any ?? https://docs.microsoft.com/en-us/archive/blogs/kcwalina/how-to-design-exception-hierarchies Excerpt from Krzysztof Cwalina (software architect) : Quote I still get a lot of questions on how to design exception hierarchies, despite several attempts to describe it in talks, the FDG book, and in posts on this blog. Maybe the guidance gets lots in the in the complexities of the full guidance surrounding exception handling or I am a bad communicator. Let me assume the former :-), and so here is one more attempt at describing the guidance in the most succinct way I am capable of Edited August 28, 2022 by flydev ?? excerpt 2 Link to comment Share on other sites More sharing options...
froot Posted August 30, 2022 Author Share Posted August 30, 2022 thanks for the input, I'm a step further now. Is there a way to catch a PHP Notice? I'd like to stop the code and handle appropriately or at least create a log or get an email if anything goes wrong so I can debug. Because it's quite a work load to anticipate everything that could go wrong and throw exceptions manually… Right now I can only catch \Exception, \Throwable and WireException I believe. 1 Link to comment Share on other sites More sharing options...
flydev Posted August 30, 2022 Share Posted August 30, 2022 I am on mobile, so short answer. You can define your own error handler with `set_error_handler`. (Do not forget to restore the default handler, check the php doc.) Example: function send_email_on_notice() { … } set_error_handler("send_email_on_notice", E_NOTICE); […] restore_error_handler() Consider testing the behavior of it if you use it on a try/catch block. 2 Link to comment Share on other sites More sharing options...
froot Posted September 1, 2022 Author Share Posted September 1, 2022 The thing is, I need to catch anything that php would echo out because it's an AJAX-response that I would parse in the frontend. If it's anything else than valid JSON, JS crashes and stops. So I either try and catch errors when awaiting the AJAX-response in the frontend or try and catch all errors, exceptions, warnings, notices and whatnot in the backend. I'd say the latter is the more elegant solution cause that way all server related issues would be handled on the server, kind of. I do sent what is caught, if it's of interest to the user, nicely json-encoded to the frontend however, which brings me to my next question. How can I bail out if an error was thrown manually or thrown automatically by PW of PHP? This doesn't work, there's always a message… if ($err->getMessage() != '') { // send to user } else { // send to me } Anything I would throw manually is meant for the user to see, anything else is not but is sent to me via email or logged somewhere. Does that make sense? Thanks for help! Link to comment Share on other sites More sharing options...
flydev Posted September 2, 2022 Share Posted September 2, 2022 What I would do in your scenario is: 1) Catch any \Exception and return a valid JSON with for example: $result = ['success' => false, 'error_msg' => 'Description of the error']; and log the exception original message in your logs 2) To "catch" a notice or warning, do that from a script that analyze a custom Apache ErrorLog and send you a mail on a pattern you would like to receive the mails. Just do not show "errors, mean warning, notice..." but log them into a custom Apache ErrorLog. 3) <- should be the first step, write Test Cases, test your code, and more over, do not upgrade a production code directly, as the most notice and warning you will get once your code is working is from deprecated code (PHP version, ProcessWire, Modules..). And do not forget that you can handle many scenario, eg., you can catch WireException, CustomException, \Exception. You could read some Ryan's code by opening files that are in the wire\core folder to get some example. 2 Link to comment Share on other sites More sharing options...
froot Posted September 2, 2022 Author Share Posted September 2, 2022 thanks for your input, will look into that. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now