Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I try/catch a warning?

I need to catch some warnings being thrown from some php native functions and then handle them.

Specifically:

array dns_get_record  ( string $hostname  [, int $type= DNS_ANY  [, array &$authns  [, array &$addtl  ]]] ) 

It throws a warning when the DNS query fails.

try/catch doesn't work because a warning is not an exception.

I now have 2 options:

  1. set_error_handler seems like overkill because I have to use it to filter every warning in the page (is this true?);

  2. Adjust error reporting/display so these warnings don't get echoed to screen, then check the return value; if it's false, no records is found for hostname.

What's the best practice here?

like image 734
user121196 Avatar asked Aug 06 '09 21:08

user121196


People also ask

Can you catch warnings in Python?

Specify the message and module that should be filtered, either as a string or as a regular expression. Create your own warnings, as subclasses of existing warning classes. Capture warnings with Python's logging module, rather than printing the output to sys.

What is a PHP warning?

A warning error in PHP does not stop the script from running. It only warns you that there is a problem, one that is likely to cause bigger issues in the future. The most common causes of warning errors are: Calling on an external file that does not exist in the directory. Wrong parameters in a function.

How do you check for errors in R?

In R Programming, there are basically two ways in which we can implement an error handling mechanism. Either we can directly call the functions like stop() or warning(), or we can use the error options such as “warn” or “warning. expression”.


2 Answers

Set and restore error handler

One possibility is to set your own error handler before the call and restore the previous error handler later with restore_error_handler().

set_error_handler(function() { /* ignore errors */ }); dns_get_record(); restore_error_handler(); 

You could build on this idea and write a re-usable error handler that logs the errors for you.

set_error_handler([$logger, 'onSilencedError']); dns_get_record(); restore_error_handler(); 

Turning errors into exceptions

You can use set_error_handler() and the ErrorException class to turn all php errors into exceptions.

set_error_handler(function($errno, $errstr, $errfile, $errline) {     // error was suppressed with the @-operator     if (0 === error_reporting()) {         return false;     }          throw new ErrorException($errstr, 0, $errno, $errfile, $errline); });  try {     dns_get_record(); } catch (ErrorException $e) {     // ... } 

The important thing to note when using your own error handler is that it will bypass the error_reporting setting and pass all errors (notices, warnings, etc.) to your error handler. You can set a second argument on set_error_handler() to define which error types you want to receive, or access the current setting using ... = error_reporting() inside the error handler.

Suppressing the warning

Another possibility is to suppress the call with the @ operator and check the return value of dns_get_record() afterwards. But I'd advise against this as errors/warnings are triggered to be handled, not to be suppressed.

like image 155
Philippe Gerber Avatar answered Sep 30 '22 03:09

Philippe Gerber


The solution that really works turned out to be setting simple error handler with E_WARNING parameter, like so:

set_error_handler("warning_handler", E_WARNING); dns_get_record(...) restore_error_handler();  function warning_handler($errno, $errstr) {  // do something } 
like image 22
Robert Avatar answered Sep 30 '22 03:09

Robert