ejemplo - Manejo de errores de PHP DOMDocument
php domdocument savexml (5)
En mi aplicación, estoy cargando xml desde url para analizarlo. Pero a veces esta url puede no ser válida. En este caso necesito manejar los errores. Tengo el siguiente código:
$xdoc = new DOMDocument();
try{
$xdoc->load($url); // This line causes Warning: DOMDocument::load(...)
// [domdocument.load]: failed to open stream:
// HTTP request failed! HTTP/1.1 404 Not Found in ...
} catch (Exception $e) {
$xdoc = null;
}
if($xdoc == null){
// Handle
} else {
// Proceed
}
Sé que probablemente lo estoy haciendo mal, pero ¿cuál es la forma correcta de manejar este tipo de excepciones? No quiero ver mensajes de error en mi página.
El manual para DOMDocument :: load () dice:
Si se pasa una cadena vacía como nombre de archivo o si se nombra un archivo vacío, se generará una advertencia. Esta advertencia no es generada por libxml y no puede manejarse usando las funciones de manejo de errores de libxml.
Pero no hay información sobre cómo manejarlo.
Gracias.
De lo que puedo obtener de la documentation , el manejo de las advertencias emitidas por este método es complicado porque no son generadas por la extensión libxml y por lo tanto no pueden ser manejadas por libxml_get_last_error()
. Puede usar el operador de supresión de errores y verificar el valor de retorno para ver si está false
...
if (@$xdoc->load($url) === false)
// ...handle it
... o registre un controlador de errores que lanza una excepción en caso de error :
function exception_error_handler($errno, $errstr, $errfile, $errline ) {
throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}
y luego atraparlo.
Desde php.net
Si se pasa una cadena vacía como nombre de archivo o si se nombra un archivo vacío, se generará una advertencia. Esta advertencia no es generada por libxml y no puede manejarse usando las funciones de manejo de errores de libxml.
En su entorno de producción no debería mostrar errores al usuario. No necesitan verlos, así que teniendo en cuenta que puedes usar ...
$xdoc = new DOMDocument();
if ( $xdoc->load($url) ) {
// valid
}
else {
// invalid
}
Para deshabilitar los errores de lanzamiento:
$internal_errors = libxml_use_internal_errors(true);
$dom = new DOMDocument();
// etc...
libxml_use_internal_errors($internal_errors);
Para mí, siguiendo hice el truco.
$feed = new DOMDocument();
$res= @$feed->load(''http://www.astrology.com/horoscopes/daily-extended.rss'');
if($res==1){
//do sth
}
set_error_handler(function($number, $error){
if (preg_match(''/^DOMDocument::loadXML/(/): (.+)$/'', $error, $m) === 1) {
throw new Exception($m[1]);
}
});
$xml = new DOMDocument();
$xml->loadXML($xmlData);
restore_error_handler();
Eso me funciona en PHP 5.3. Pero si no está utilizando loadXML
, es posible que deba hacer algunas modificaciones.