8791 sujets

Développement web côté serveur, CMS

Bonjour,

Dans le cadre du developpement d'un site, j'essaie d'afficher le flux XML d'un autre site (FNAIM dans le cas présent).

Tout se passe bien quand le flux existe, mais quand il n'existe pas, mon exception est bien lancée, mais j'ai quand même un message d'erreur :


try{ 
	if(!$xml=simplexml_load_file($flux)){  
		throw new Exception('Le flux FNAIM est introuvable');  
	}         
	if(empty($xml->channel->title) || empty($xml->channel->description) || empty($xml->channel->item->title))  
		throw new Exception('Le flux FNAIM est invalide');  
	
	foreach ( $xml->channel->item as $value){

	}
}  
	catch(Exception $e){  
	echo $e->getMessage();  
} 


J'ai toujours une erreur à la ligne
if(!$xml=simplexml_load_file($flux)){  


L'erreur est :
Erreur inconnue a la ligne 77 dans le fichier C:\SITES\neyrat\Include\parseur.inc.php
[2] simplexml_load_file() [<a href='function.simplexml-load-file'>function.simplexml-load-file</a>]: I/O warning : failed to load external entity &quot;&quot;


Je ne souhaite pas utiliser la méthode consistant à mettre un @ dans l'expression Smiley lol

Avez-vous une idée pour résoudre ce problème ?

Merci d'avance à vous tous.
Modifié par Xenon03 (15 Jan 2010 - 11:32)
Euh... oui merci Smiley biggrin

a écrit :
Tout se passe bien quand le flux existe, mais quand il n'existe pas, mon exception est bien lancée, mais j'ai quand même un message d'erreur :

Modifié par Xenon03 (13 Jan 2010 - 12:18)
Salut,

je suis un peu surpris qu'un WARNING ne soit pas catché... et je dirais même que ça ressemble à un bug. Smiley confuse

Quoi qu'il en soit si tu ne veux pas utiliser @ tu peux :
* soit modifier le niveau de error_reporting (ce qui devrait de toutes façons être le cas avant une mise en ligne).
* soit regarder du côté de set_error_handler.
Justement, j'ai declaré un error handler différent, mais ce n'est pas le genre d'erreur que je ne souhaite pas recupérer dans le handler, d'où l'exception.

Car pour info, mon handler intercepte les erreurs et les mets dans un txt, et cette erreur la ne vient pas de ma programmation, donc je ne veut pas qu'elle apparaisse dans le txt Smiley cligne
Xenon03 a écrit :
cette erreur la ne vient pas de ma programmation, donc je ne veut pas qu'elle apparaisse dans le txt
Ben du coup, et comme je pense qu'il s'agit bien d'un bug de PHP, j'aurais opté pour l'arobase. Smiley murf
Modifié par Heyoan (13 Jan 2010 - 16:46)
Salut,

Ce n'est pas une erreur :
doc php a écrit :

Erreurs / Exceptions

Produit un message d'erreur de niveau E_WARNING pour chaque erreur trouvée dans les données XML.


Astuce

Utilisez la fonction libxml_use_internal_errors() pour supprimer toutes les erreurs XML, et la fonction libxml_get_errors() pour les parcourir.


Et vider les erreurs avec libxml_clear_errors
Arf ! Désolé ! Je pensais que tu parlais d'une doc généraliste sur XML/PHP. Smiley cligne

Cela dit je continue de ne pas comprendre qu'un tel WARNING ne soit pas catché dans le try/catch...
Cette méthode fonctionne :


libxml_use_internal_errors(true);
$flux             =        '...'; // adresse du flux à afficher
$doc = simplexml_load_string($flux);
$xml = explode("\n", $flux);
if (!$doc) {
	try{  
	
		if(!$xml=simplexml_load_file($flux)){  
			throw new Exception('Le flux est introuvable');  
		}         
		if(empty($xml->channel->title) || empty($xml->channel->description) || empty($xml->channel->item->title))  {
			throw new Exception('Le flux est invalide');
		}
	}  
		catch(Exception $e){  
		echo $e->getMessage();  
	}

}


Merci beaucoup Smiley lol