Précédent   Forum des professionnels en informatique > PHP > Langage > Syntaxe
Syntaxe Forum d'entraide sur la syntaxe de PHP et la POO. Avant de poster -> FAQ syntaxe, Cours d'initiation et cours de POO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/01/2008, 14h21   #1
Invité de passage
 
Inscription : décembre 2004
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2004
Messages : 5
Points : 1
Points : 1
Par défaut [POO] Exception et "try catch"

Bonjour, voilà j'ai un petit problème avec des exceptions assez bizarre.

J'ai fais une classe doc_exception qui récupèrera certaines erreurs pour les ajouter à mon objet doc.
Il y a 2 types d'erreurs : 'warning' et 'error'.
'error' stoppera l'exécution de tout ce qui se trouve dans le premier try catch.

Le programme fonctionne de la manière suivante :
Je récupère un XML récupère des informations principales puis utilise (dépendant celle-ci) une classe.
Cette partie se trouve dans entouré d'un try catch qui va récupérer mon erreur.
A l'intérieur de chaque classes, j'ai placé plusieurs try catch.

Ils fonctionnent de la manière suivante :
Si une erreur est levé, un test est fait dans le catch , si c'est un 'error', l'erreur est à nouveau levé pour etre récupéré et renvoyé jusqu'au tout premier try catch.

Le problème que je rencontre me semble étrange (il fonctionne parfaitement en local, mais une fois sur le serveur, un problème apparait).

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
foreach($block_data_array as $block_data) {
try {
	if(empty($block_data['field_a'])){
		//$this->addDebug("ERROR : field_a Tag missing or empty.");
//EXCEPTION concerning the field_a Tag missing or empty.
		throw new doc_exception(330);
	}else{
		$internal_department_id = "";
		if(empty($block_data['field_b'])){
//EXCEPTION concerning the tag field_b not existing or empty.
			throw new doc_exception(3301);
		}else {
			$internal_department_id = $db->getOne("...");
			if(empty($internal_department_id)){
//EXCEPTION concerning the tag field_b not existing in the table departments.
				throw new doc_exception(3302,'field_b = '.$block_data["field_b"]);
			}
		}
		$storage_unit_number = $block_data['field_a'];
		$i=1;
		do{
			$this->addDebug("Test if an Storage_Type (tag field_c".$i.") is existing.");
			if(empty($block_data['field_c'.$i])){
				if($i==1){
//EXCEPTION concerning the tag field_c1 : if this one do not exist, The Block can't be handled.
					throw new doc_exception(331,$storage_unit_number);
				}else{
					$this->addDebug("There is no more field_c in this Block.");
					$i=4;
				}
			}else{
				$storage_unit_type = $block_data['field_c'.$i];
				$storage_unit_id = $db->getOne("...");
				if(empty($storage_unit_id)){
//EXCEPTION concerning the tag field_c($i) and the tag field_a => We skip the insertion of this part if the 
					throw new doc_exception(332);
				}
				$storage_quantity = "";
				$storage_quantity_unit_id = "";
				try{
					if(is_numeric($block_data['lhmg'.$i])){
						$storage_quantity = $block_data['lhmg'.$i];
					}else{
//EXCEPTION concerning the tag lhmg($i) if numeric or not
						throw new doc_exception(333,'lhmg'.$i);
					}
				}catch (doc_exception $e){
					$error_msg = $e->getMsgError();
					if($error_msg!=""){$this->addDebug($error_msg);debugText($error_msg);}
					if($e->getTypeError()){throw $e;}
				}
				try{
					if(!empty($block_data['field_d'.$i])){
						$storage_quantity_unit_id = $db->getOne("...");
						if(empty($storage_quantity_unit_id)){
//EXCEPTION concerning 
							throw new doc_exception(3331,'field_d'.$i.'= '.$block_data['field_d'.$i]);
						}
					}else{
						throw new doc_exception(333,'field_d'.$i);
					}
				}catch (doc_exception $e){
					$error_msg = $e->getMsgError();
					if($error_msg!=""){$this->addDebug($error_msg);debugText($error_msg);}
					if($e->getTypeError()){throw $e;}
				}
				//TEST IF ALREADY EXISTING IN THE ARRAY
				$test_exist = false;
				foreach ($this->storage_unit_mapping as $storage_mapping){
					if((($storage_mapping['internal_department_id'])==$internal_department_id)&&(($storage_mapping['storage_unit_id'])==$storage_unit_id)){
						$test_exist = true;
					}
				}
				if($test_exist){
					$this->addDebug("this is existing in the array already.");
//EXCEPTION concerning 
					throw new doc_exception(334);
				}
				$this->addDebug("INSERT : ('internal_department_id' => $internal_department_id, 'storage_unit_id' => $storage_unit_id, 'storage_quantity' => $storage_quantity, 'storage_quantity_unit_id' => $storage_quantity_unit_id)"); 
				$this->storage_unit_mapping[] = array(
								'internal_department_id' => $internal_department_id,
								'storage_unit_id' => $storage_unit_id,
								'storage_quantity' => $storage_quantity,
								'storage_quantity_unit_id' => $storage_quantity_unit_id
								);
				$i++;
			}
		}while ($i<4);
	}
}catch (doc_exception $e){
	$error_msg = $e->getMsgError();
	if($error_msg!=""){$this->addDebug($error_msg);debugText($error_msg);}
	if($e->getTypeError()){throw $e;}
}
}
Tout les try catch fonctionnent, sauf le tout dernier qui est censé arrêter le parcours du bloc en cours pour passer au suivant et ajoute une erreur de type warning ou arrete tout avec une erreur de type 'error'.

En local, c'est ce qu'il se passe, tout fonctionne parfaitement.
Mais sur le serveur où il est prévu de fonctionner. le dernier catch est seulement ignoré et est donc récupéré par le catch au niveau supèrieur, qui est le tout premier.

Je ne vois pas pourquoi il ne fonctionne pas :s
XenoDeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2008, 21h31   #2
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Salut,

J'avoue que j'ai eu la flemme de décortiquer ton code, trop fatigué après une journée de taff.
Mais il faut aussi envisager une possibilité : le dernier catch est effectivement éxécuté, mais provoque lui-même une exception, qui est alors propagée et interceptée dans le bloc parent.

Un petit placé dans le bloc que tu supposes ne pas passer pourra te le confirmer. Si tu as quelquechose qui s'affiche, alors y a un blème dans ton bloc catch...
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 12h20   #3
Invité de passage
 
Inscription : décembre 2004
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2004
Messages : 5
Points : 1
Points : 1
Hmmm rien ne s'affiche en local et sur le serveur, bizarre.
à moins que je me serve mal de cette fonction?

j'ai fait ça : $this->addDebug(var_dump($e));

Mais rien ne s'affiche.
Le catch est bien exécuté en localhost, mais ignoré sur le serveur.

Est ce que vous auriez une idée, de qu'est ce qui pourrait faire fonctionner différement les exceptions/try/catch d'un serveur à un autre?
XenoDeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 12h28   #4
Modérateur
 
Avatar de s.n.a.f.u
 
Homme
Développeur Web
Inscription : août 2006
Messages : 2 700
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 37
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : août 2006
Messages : 2 700
Points : 3 357
Points : 3 357
Var_dump tout seul suffira.
Ca va te faire une sortie très laide sur le navif=gateur, mais très pratique en code source.
Je t'invite à aller voir la définition e cette fonction extrêmement pratique pour debugger.
s.n.a.f.u est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2008, 12h50   #5
Invité de passage
 
Inscription : décembre 2004
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2004
Messages : 5
Points : 1
Points : 1
Var_dump a pas l'air de vouloir afficher quelque ce soit, peut-être en raison de la présence de ob_start();...appel de mes fonctions...$debug_string = ob_get_contents();ob_clean();

J'ai essayé un $this->addDebug(print_r($e,true));
En local, je reçoit bien tout l'array représentant l'objet exception.
Sur le serveur, rien n'est affiché.
XenoDeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2008, 11h58   #6
Invité de passage
 
Inscription : décembre 2004
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2004
Messages : 5
Points : 1
Points : 1
J'ai essayé sur un autre pc en localhost, tout fonctionne ..
Donc le serveur a un problème -_-
XenoDeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/02/2008, 09h31   #7
Invité de passage
 
Inscription : décembre 2004
Messages : 5
Détails du profil
Informations personnelles :
Âge : 27

Informations forums :
Inscription : décembre 2004
Messages : 5
Points : 1
Points : 1
-_-

Problème Résolu :

eAccelerator faisait tout planter ( ça je sais pas pourquoi <_<; )
Donc une fois désactivé, tout fonctionne correctement.

( et dire que j'ai passé 2 jours à voir et modifier mes try catch et tout )
XenoDeus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h15.


 
 
 
 
Partenaires

Hébergement Web