IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

[Language]De l'utilité des try/catch


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut [Language]De l'utilité des try/catch
    salut tout le monde !

    jaimerai savoir a quoi sert exactement Try et Catch..

    merci

  2. #2
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 818
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 818
    Par défaut
    Salut,

    A traiter les exceptions.
    Un début d'explication dans la FAQ
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    mais ils vont toujours ensemble non ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 104
    Par défaut
    Pas forcément.

    On peut avoir un try avec plusieurs catch.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    try {
    ...
    } catch (Exception1 e1) {
    ...
    } catch (Exception2 e2) {
    ...
    }
    On peut aussi avoir un try sans catch mais avec finally.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    try {
    ...
    } finally {
    ...
    }
    Par contre, il est vrai qu'on a jamais de catch sans try !

  5. #5
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    cest quoi la différence entre catch et finally ? try veut dire essaie et catch prend... c'est juste comme je vois les chose ?

  6. #6
    Membre confirmé
    Avatar de jak0
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 272
    Par défaut
    Alors, tu dois placer le code qui peut générer une erreur "throws ...Exception" et utiliser le bloc catch pour exécuter du code en fonction de l'exception lancé...
    Le bloc finally existe bien, il sert à executer une partie de code, que l'exception soti lancé ou non.
    Mais en fait, il est totalement inutil : si tu place ton code après la balise catch il sera toujours exécuté...
    Par ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try {
        String[] str = {"str1", "str2"};
        String str2 = str[ str.length+1 ]; // lance une exception
        System.out.println("cela n'est pas interprete...");
    } catch (IndexArrayOutOfBoundsException e) {
        System.out.println("cela est interprete,car l'exception a ete lance");
    }
    System.out.println("dans tous les cas, on affiche ca");
    As-tu besoin de plus de précisions ?

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par jak0
    Le bloc finally existe bien, il sert à executer une partie de code, que l'exception soti lancé ou non.
    Mais en fait, il est totalement inutil : si tu place ton code après la balise catch il sera toujours exécuté...
    Non le bloc finally n'est pas totalement inutile !

    Comme tu l'as dit il est exécuté dans tous les cas, y compris :
    • Si une exception du bloc try/catch n'est pas attrapé.
    • S'il y a un return dans le bloc try/catch


    C'est très avantageux car cela permet de mieux traiter les cas d'erreurs en n'utilisant qu'un seul code pour la fermeture (en particulier si tu veux renvoyer l'exception à la méthode appellante...

    Exemple pour l'ouverture d'un flux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public void readFile() throws IOException {
    		InputStream input = null;
    		try {
    			input = new FileInputStream("...");
     
    			// plusieurs acces au fichier
     
    		} finally {
    			if (input!=null) {
    				input.close();
    			}
    		}
    	}
    Les exception ne sont pas traité mais renvoyé à la méthode appellante (throws IOException) mais quoi qu'il arrive le flux sera bien fermé...

    a++

  8. #8
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 904
    Billets dans le blog
    54
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Mais en fait, il est totalement inutil
    NON

    Dans ton cas si tu as une NullPointerException ou tout autre exception non-catchee dans le code, les lignes situees apres le block catch ne seront JAMAIS executees car tu n'attrape que des IndexArrayOutOfBoundsException.

    Avec finally elle seront TOUJOURS executees.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  9. #9
    Membre confirmé
    Avatar de jak0
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 272
    Par défaut
    On est d'accord sur le fait que :
    - Le code se trouvant dans le bloc finally s'exécute quoi qu'il arrive.

    Quand est-il du code se trouvant après le bloc try-catch-finally ?????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    try {
       code1...
    } catch (Exception e) {
       code2...
    } finally {
       code3...
    }
    code4..
    En catchant Exception, je catch tout donc pas de probleme avec ton nullpointerexception. Le code4 se toujours executé, a mois bien sur d'une grosse exception, genre OutOfMemoryError, mais là, c'est pas dis que le finally soit itnerpreté aussi...

    Sans utiliser le catch général, tu dois pouvoir utiliser les catch de toutes les éventuelles exceptions lancés... Et je pense que le but de la progra est dévité les exceptions, pas de les traiter, ceci nest utile que dans certains cas. Enfin ca, ca nengage que moi...

  10. #10
    Membre confirmé
    Avatar de jak0
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 272
    Par défaut
    Citation Envoyé par bouye
    Dans ton cas si tu as une NullPointerException ou tout autre exception non-catchee dans le code, les lignes situees apres le block catch ne seront JAMAIS executees car tu n'attrape que des IndexArrayOutOfBoundsException.
    Et je sais ce que c'est que de catcher telle ou telle exception. C'est lexemple qui est important pas les variantes choisies.
    Toutefois tu as raison sur le principe, mais je pense quand meme, que si des exceptions sont lancés sans que tu les ai catchés, c'est que ta pas fait ton boulo.

  11. #11
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jak0
    a mois bien sur d'une grosse exception, genre OutOfMemoryError, mais là, c'est pas dis que le finally soit itnerpreté aussi...
    Oui, même dans ce cas le finally sera interprété...

    Citation Envoyé par jak0
    Et je pense que le but de la progra est dévité les exceptions, pas de les traiter, ceci nest utile que dans certains cas. Enfin ca, ca nengage que moi...
    Cela dépend de l'exception...
    Bien sûr les exceptions/erreurs dû à une mauvaise exécution du programme sont à éviter (style NullPointerException, ArrayIndexOutOfBoundException, StackOverflowError, etc...)

    Mais il y a un grand nombre d'erreur qu'il faut traiter à un moment ou à un autre dans ton application, en particulier tout ce qui concerne les données utilisateurs et les flux de lecture/écriture (fichier, réseaux, etc...). Car dans ce cas l'erreur n'est pas prévisible ni évitable...

    Le bloc finally est prévu pour fermet tous les flux et libérer les eventuelles ressources. C'est très important en particulier pour les applications serveurs...


    Citation Envoyé par jak0
    Quand est-il du code se trouvant après le bloc try-catch-finally ?????
    Le bloc finally n'a aucun impact sur le code qui le suit... Ce dernier sera exécuté ou non selon ce que tu fais dans ton bloc try/catch (sauf bien sûr en cas d'exception dans le bloc finally)...

  12. #12
    Membre éprouvé
    Homme Profil pro
    Ingénieur réseau et sécurité / Consultant
    Inscrit en
    Août 2005
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ingénieur réseau et sécurité / Consultant
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2005
    Messages : 1 068
    Par défaut
    ok... lol c'est claire là...

  13. #13
    FFF
    FFF est déconnecté
    Membre éclairé Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Par défaut
    une petite participation supp :

    personnellement, comme dit précédemment je trouve l'utilisation de try {} catch {} extrement utile.
    J'ajoute que ces blocs s'utilisent aussi pour gagner du temps (en programmation et en exécution du prgramme pour gérer des erreurs "inattendues", dues à l'utilisation du programme. L'exemple le plus basique et le plus démonstratif reste la division par 0. Tu le gères en 2 lignes avec try{} et catch sans test de valeur..., alors que la programmation permettant d'éviter cette exceptions te prend plus de 2 lignes et au moins 1 test de la valeur posant problème dans l'application...
    Donc c'est aussi dans la plupart des cas un gain de temps que de l'utiliser !

  14. #14
    Membre confirmé
    Avatar de jak0
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 272
    Par défaut
    Je suis tout à fait d'accord quant à l'utilité des try catch, ce que je remet en cause c'est le finally, c'est tout...

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 104
    Par défaut
    Le finally te permet d'executer du code que le bloc try s'exécute bien ou mal.
    L'exemple de adiGuba où le finally sert à être sûr de fermer un stream est typique.

    Sans ce bloc finally, certains postent sur ce forum pour demander pourquoi ils n'arrivent pas à faire file.delete(). Finally n'est donc pas un gadget inutile !

  16. #16
    Membre confirmé
    Avatar de jak0
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 272
    Par défaut
    Ca empeche pas, que ton truc tu peut le fermé après le bloc try catch, tout simplement après...

  17. #17
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jak0
    Ca empeche pas, que ton truc tu peut le fermé après le bloc try catch, tout simplement après...
    Oui mais si tu recois une exception imprévu, tu peux te retrouver avec des resources toujours ouvertes, et dans le cas d'une application serveur cela peut vite poser problème... (Si le thread de traitement d'un client plante le problème est limité, mais si on ne peut plus ouvrir de ressources car on a atteint la limite c'est plus grave car du coup l'erreur touche à tous les utilisateurs).


    Ensuite si ta méthode doit laisser remonter les exceptions tu te retrouves avec une gestion complexe, où tu dois attraper les exceptions, pour fermer les flux et les remonter, alors qu'un simple finally suffit... Et c'est d'autant plus vrai si tu as plusieurs types d'exceptions différentes que tu dois gérer différement...


    De plus si je ne me trompe pas le bloc finally est apparu avec Java 1.2, et étant donné que Sun souhaite modifier le moins possible le langage (les nouvelles possibilitées de Java 5.0 étaient demandé depuis plusieurs années déjà...), si il a été ajouté c'est qu'il propose une solution a un grand nombre de problème...


    Enfin ce n'est pas parce que tu ne l'utilises pas que c'est forcément inutile...

    a++

  18. #18
    Membre confirmé
    Avatar de jak0
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    272
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 272
    Par défaut
    Citation Envoyé par "adiGuba
    Enfin ce n'est pas parce que tu ne l'utilises pas que c'est forcément inutile...
    C'est pas faux lol.
    C'est vrai que pour ca, c'est utile, je me soumet. a++

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

Discussions similaires

  1. utilité de try catch et poo
    Par coolphp5 dans le forum Langage
    Réponses: 4
    Dernier message: 18/11/2009, 11h44
  2. Gestion des exeptions (try catch) en Java
    Par EIN-LESER dans le forum Débuter avec Java
    Réponses: 8
    Dernier message: 21/05/2008, 19h51
  3. [C#] Comment bien utiliser des TRY CATCH
    Par UNi[FR] dans le forum C#
    Réponses: 5
    Dernier message: 14/11/2007, 19h20
  4. Réponses: 2
    Dernier message: 30/10/2007, 08h41
  5. [Language]try/catch
    Par nicolas581 dans le forum Langage
    Réponses: 6
    Dernier message: 24/05/2005, 16h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo