Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    janvier 2010
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : janvier 2010
    Messages : 250
    Points : 178
    Points
    178

    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 !

  2. #2
    Membre émérite
    Avatar de Enerian
    Homme Profil pro Etienne Tissières
    Ingénieur développement logiciels
    Inscrit en
    août 2011
    Messages
    229
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne Tissières
    Âge : 24
    Localisation : France

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

    Informations forums :
    Inscription : août 2011
    Messages : 229
    Points : 874
    Points
    874

    Par défaut

    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)" ?

  3. #3
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    janvier 2010
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : janvier 2010
    Messages : 250
    Points : 178
    Points
    178

    Par défaut

    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!

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur
    Inscrit en
    janvier 2010
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

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

    Informations forums :
    Inscription : janvier 2010
    Messages : 250
    Points : 178
    Points
    178

    Par défaut

    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..

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •