Попробуйте Catch с предупреждениями PHP

Можно ли сделать какую-то попытку catch, которая будет улавливать предупреждения?

например

if (!$dom->loadHTMLFile($url)) { //if cant load file handle error my way } 

Для $url я использую, я получаю

 Warning (2): DOMDocument::loadHTMLFile(MYURL) [domdocument.loadhtmlfile]: failed to open stream: HTTP request failed! HTTP/1.0 403 Forbidden [APP\controllers\import_controller.php, line 62] Warning (2): DOMDocument::loadHTMLFile() [domdocument.loadhtmlfile]: I/O warning : failed to load external entity "hMYURL" [APP\controllers\import_controller.php, line 62] 

Я мог бы просто подавить ошибку и сделать что-то, если вызов возвращает false, но я хочу уловить точное предупреждение, а затем что-то сделать с ним.

Это возможно?

благодаря

Для этого вы должны использовать libxml_use_internal_errors .

Этот пример адаптирован из руководства:

 libxml_use_internal_errors(true); $doc = new DOMDocument(); $res = $doc->loadHTMLFile($url); //this may fail and return FALSE! foreach (libxml_get_errors() as $error) { // handle errors here } libxml_clear_errors(); 

Здесь не будут извещения о PHP.

Вероятно, вы ищете это

 <?php // error handler function function myErrorHandler($errno, $errstr, $errfile, $errline) { switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } /* Don't execute PHP internal error handler */ return true; } // function to test the error handling function scale_by_log($vect, $scale) { if (!is_numeric($scale) || $scale <= 0) { trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR); } if (!is_array($vect)) { trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING); return null; } $temp = array(); foreach($vect as $pos => $value) { if (!is_numeric($value)) { trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE); $value = 0; } $temp[$pos] = log($scale) * $value; } return $temp; } // set to the user defined error handler $old_error_handler = set_error_handler("myErrorHandler"); // trigger some errors, first define a mixed array with a non-numeric item echo "vector a\n"; $a = array(2, 3, "foo", 5.5, 43.3, 21.11); print_r($a); // now generate second array echo "----\nvector b - a notice (b = log(PI) * a)\n"; /* Value at position $pos is not a number, using 0 (zero) */ $b = scale_by_log($a, M_PI); print_r($b); // this is trouble, we pass a string instead of an array echo "----\nvector c - a warning\n"; /* Incorrect input vector, array of values expected */ $c = scale_by_log("not array", 2.3); var_dump($c); // NULL // this is a critical error, log of zero or negative number is undefined echo "----\nvector d - fatal error\n"; /* log(x) for x <= 0 is undefined, you used: scale = $scale" */ $d = scale_by_log($a, -2.5); var_dump($d); // Never reached ?> 

это сделает этот вывод:

 vector a Array ( [0] => 2 [1] => 3 [2] => foo [3] => 5.5 [4] => 43.3 [5] => 21.11 ) ---- vector b - a notice (b = log(PI) * a) <b>My NOTICE</b> [1024] Value at position 2 is not a number, using 0 (zero)<br /> Array ( [0] => 2.2894597716988 [1] => 3.4341896575482 [2] => 0 [3] => 6.2960143721717 [4] => 49.566804057279 [5] => 24.165247890281 ) ---- vector c - a warning <b>My WARNING</b> [512] Incorrect input vector, array of values expected<br /> NULL ---- vector d - fatal error <b>My ERROR</b> [256] log(x) for x <= 0 is undefined, you used: scale = -2.5<br /> Fatal error on line 35 in file trigger_error.php, PHP 5.2.1 (FreeBSD)<br /> Aborting...<br /> 

Прочитайте больше

Возможно, вы сможете использовать собственный обработчик ошибок, но я не совсем уверен, могут ли быть обработаны предупреждения. Некоторые ошибки или предупреждения всегда будут использовать обработчик ошибок по умолчанию. Но просто попробуйте.

Я просто нашел очень привлекательное решение по адресу http://bytes.com/topic/php/answers/6296-catch-warnings :

Сначала скажите PHP, чтобы отслеживать все ошибки:

 ini_set('track_errors', '1'); 

Это помещает все сообщения об ошибках (включая предупреждения) в переменную $php_errormsg (см. http://www.php.net/manual/en/errorfunc.configuration.php#ini.track-errors ).

Затем вы можете поймать ошибки и предупреждения следующим образом:

 if (!@copy('no_file', 'some_file')) { echo $php_errormsg, "\n"; }