Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/12/2012, 11h41   #1
d0n32
Membre habitué
 
Homme
Ingénieur
Inscription : janvier 2010
Messages : 230
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 230
Points : 138
Points : 138
Par défaut Problème sur une gestion des exceptions

Bonjour,

Je suis face à un comportement très étrange de l'application sur laquelle je travaille, peut-être que vous pourrez m'éclairer....


J'ai le code suivant, que j'ai simplifié pour les explications (oui, le problème pourrait venir ce que j'ai enlevé, mais je ne peux pas tout poster ici, ça serait illisible) :

Une méthode "main" qui traite en boucle des données, avec une gestion d'exception de façon globale:
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
 
public static void main(String[] args){
	try {
		while (boucle)
		{
			//Début du traitement 
 
			// appel d'une methode
			maMethode(arg1, arg2);
 
			//Suite du traitement
                        Log.info("Traitement en cours")
		}
 
		//Log de fin de traitement
		Log.info("Fin du traitement")
	}
	catch(Exception e){
		//Traitement de l'exception
		//Log exception
		Log.info("Exception")
	}
	finally{
		// Log finally
		Log.info("Finally")
	}
}

Et une méthode interne appelant un service externe que je ne maîtrise pas. Ce service peut potentiellement lancer diverses exceptions.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
private Object maMethode(Object arg1, Object arg2){
 
	Object result = valeurParDefaut;
 
	try{
		//Appel d'une méthode exterieure complexe que je ne maitrise pas
		result = methodeExterieure();
 
	catch (final Exception e)
         {
            //  traitement de l'exception       
         }
 
	return result;
}

Donc normalement, si la méthode extérieure lance une exception, le traitement dans la boucle continue et passe aux données suivantes.

J'espère que c'est assez clair...


Mon problème est le suivant :
Le traitement tombe en erreur et la boucle s’arrête pour une raison inconnue.
J'ai dans les logs les messages suivants :
- Info : Traitement en cours
- Warning avec stacktrace lancé par la méthode exterieure
- Info : Finally

Donc visiblement, la méthode extérieure plante, affiche un warning mais pas d'exception. Et le traitement s'arrête là.

Je ne comprend absolument pas ce comportement.
Je remercie vivement quiconque prendrait la peine se poser sur mon problème et m'éclairer de ses lumières !
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2012, 12h51   #2
Enerian
Membre expérimenté
 
Homme Etienne
Ingénieur développement logiciels
Inscription : août 2011
Messages : 107
Détails du profil
Informations personnelles :
Nom : Homme Etienne
Âge : 22
Localisation : France

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : août 2011
Messages : 107
Points : 500
Points : 500
Salut

Le problème, c'est que je n'ai pas l'impression qu'on ait toutes les billes. Avec le code que tu as posté, même si la méthode extérieure soulève une exception, elle devrait être rattrapée par le "catch (final Exception e)" de "maMethode", et ne devrais donc en aucun cas altérer la boucle du main.

Est-ce que dans le bloc "catch (final Exception e)" de "maMethode" tu catch une exception ? Autrement dit, est-ce que ta méthode extérieure ne fait que logger l'erreur ou est-ce qu'elle relance l'exception en plus ?

J'ai pensé au cas ou la méthode externe force un arret du processus, mais dans ce cas, les instructions du bloc Finally ne devraient pas être exécutées.

EDIT :
Je pense à un truc : si jamais la méthode externe ne lance pas une exception mais un objet instancié d'une classe directement dérivée de Throwable ou de Error... Dans ce cas, le "catch(Exception)" ne catchera pas l'erreur. Par contre le bloc finally sera exécuté.
Ce serait très moche mais ça expliquerait ton bug. Tu peux temporairement essayer de remplacer les "catch (Exception)" par "catch(Throwable)" ?
Enerian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 16h06   #3
d0n32
Membre habitué
 
Homme
Ingénieur
Inscription : janvier 2010
Messages : 230
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 230
Points : 138
Points : 138
Merci pour cette réponse.

Oui, c'est possible qu'en résumant j'ai omis l'élément important qui cause ce problème, mais le code est trop complexe pour que je poste tout ici. (Connections à des bases de données, appel à des webservices... etc.)
Je cherchais juste des idées de raisonnement...

Non, "catch (final Exception e)" de "maMethode" ne fait rien d'autre que de logger l'erreur. Le but étant juste de passer à la donnée suivante si la courante pose problème.

Pour ton EDIT, oui, c'est une bonne idée, qui a au moins le mérite d'être plausible au vu du résultat obtenu. Je vais essayer d'analyser ça!

Merci!
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/12/2012, 17h12   #4
d0n32
Membre habitué
 
Homme
Ingénieur
Inscription : janvier 2010
Messages : 230
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Ingénieur
Secteur : Industrie

Informations forums :
Inscription : janvier 2010
Messages : 230
Points : 138
Points : 138
Et ben j'ai trouvé : il y a avait un NoClassDefFoundError sur un logger propre au webservice dans methodeExterieure(), visiblement mal configuré. Merci de m'avoir mise sur la voie!

J'enrage un peu de n'avoir pas vu ça plutôt, m'enfin..
d0n32 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 04h00.


 
 
 
 
Partenaires

Hébergement Web