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

avec Java Discussion :

Exceptions et propagation


Sujet :

avec Java

  1. #1
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut Exceptions et propagation
    Hello,

    J'ai 2 questions

    Je pense avoir compris le traitement d'une exception grace aux clauses try/catch où l'on assigne un traitement dans le bloc catch en cas d'erreur décelée dans l'exécution du bloc try, mais je ne comprends pas le concept de propagation d'une exception d'une part, et l'utilité de créer des exceptions personnalisées.

    Je me suis efforcé de créer un petit exercice qui lève une exception personnalisée ou une ArithmeticException ici :

    Exception personnalisée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    package exceptionProjectBis;
     
    public class ExceptionDivision {
     
    	private int x;
    	private int y;
     
    	public ExceptionDivision(int x, int y)  {
    		super();
    		this.x = x;
    		this.y = y;
    	}
     
    	//Une méthode qui lève une exception inclut la clause "throws" et nom_E
    	public int diviser() throws DivisionByZeroException {
    		if(y==0) throw new DivisionByZeroException();
    		int res =  x/y;
    		return res;	
    	}
     
    	public class DivisionByZeroException extends Exception{
     
    		public DivisionByZeroException() {
    			super();
    			// TODO Auto-generated constructor stub
    		}
     
    	}
     
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		try {
    			ExceptionDivision ed = new ExceptionDivision(5, 0);
    			System.out.println(ed.diviser());
     
    		} catch(DivisionByZeroException e) {
    			System.out.println(e.getMessage()+"Erreur ! Division par zéro impossible");
    			//e.printStackTrace();
    		}
     
    		finally {
    			System.out.println("Veuillez saisir de nouvelles valeurs");
    		}
    	}
    }
    Avec ArithmeticException
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    public class ExceptionTer {
    	private int x;
    	private int y;
     
    	public ExceptionTer(int x, int y)  {
    		super();
    		this.x = x;
    		this.y = y;
    	}
     
    	//Une méthode qui lève une exception inclut la clause "throws" et nom_E
    	public int diviser() throws ArithmeticException {
    		if(y==0) throw new ArithmeticException();
     
    		int res =  x/y;
    		return res;	
    	}
     
    	public static void main(String[] args) {
    		try {
    			ExceptionTer ed = new ExceptionTer(5, 0);
    			System.out.println(ed.diviser());
     
    		} catch(ArithmeticException e) {
    			System.out.println("Erreur");
    			//e.printStackTrace();
    		}
     
    		finally {
    			System.out.println("Veuillez saisir de nouvelles valeurs");
    		}
    	}
    }
    Par commodité j'ai groupé les différentes classes sur un même script

    Merci

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    461
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 461
    Points : 894
    Points
    894
    Billets dans le blog
    5
    Par défaut
    Une exception doit (à minima) étendre la classe Exception ( https://docs.oracle.com/javase/7/doc...Exception.html )

    par ailleurs, contrairement à ce que l'on croit, les exceptions Java, c'est un sujet difficile.

    Dans le Joshua Bloch ( https://www.amazon.fr/Effective-Java...FPXMEWVWVN96Y2 ), il y a 9 chapitres sur le sujet.

    Je vais essayer de les résumer.

    1. Il faut utiliser les exceptions pour les choses "exceptionnelles".
    En gros, il ne faut jamais faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    try{
     int i = 0;
     while(true){
         range[i++].climb();
     }
    }catch(ArrayIndexOutOfBoundsException e){
    }
    Il faut coder:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for(Mountain m : range){
    m.climb();
    }
    2. Il existe deux types d'exceptions, les Exceptions standard (Exception) et les Runtime (RuntimeException https://docs.oracle.com/javase/7/doc...Exception.html ).
    Les RuntimeException peuvent être jetées sans être déclaré, voir levées lors de l’exécution (comme NullPointerException).
    En général, il faut utiliser les RuntimeException pour des erreurs de code et les exceptions standards pour des erreurs utilisateurs.

    3. Toujours traiter une exception. La commande throws est un traitement comme un autre.

    4. Utiliser, de préférence, une exception déjà existente.

    Cordialement.

  3. #3
    Membre expérimenté Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 592
    Points : 1 679
    Points
    1 679
    Par défaut
    Salut,

    Pour compléter la réponse de PhilippeGibault, le livre EffectiveJava est à lire après un peu d'expérience de Java, sinon, gare au mal de crâne...

    Et la propagation d'exception est une façon de traiter une exception levée dans une méthode lorsque cette méthode n'est pas la meilleure pour y réagir.

    Par exemple, une classe d'accès aux données va indiquer qu'elle ne peut se connecter à la base via une RuntimeException. Elle remontera l'information à la classe métier qui l'a appelée et qui pourra lancer une exception personnalisée au niveau proche de l'utilisateur (contrôleur, interface utilisateur, ...). Au niveau d'accès aux données, l'info disponible ne serait pas utile à l'utilisateur (erreur réseau ? listener qui ne répond pas ? l'utilisateur veut juste savoir si sa commande est réalisée).

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 310
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 310
    Points : 9 522
    Points
    9 522
    Billets dans le blog
    1
    Par défaut
    Pour ce qui est des exceptions personnalisées, c'est très utile dans bien des cas applicatifs, les exceptions standards étant par nature génériques.

    Un exemple où l'exception spécifique est utile est la détection d'une erreur de validation avec la liste des causes.

    Dans un EJB, une seule exception peut être levée à la fois, un traitement de contrôle ne pourrait donc, à priori, envoyer qu'une cause à la fois, dans l'ordre du codage des contrôles... autant dire, pas exploitable !
    On pourrait bien sûr créer un message contentant toutes les causes mais il resterait le problème de l'internationalisation des messages.
    Créer une Exception contenant une liste de causes permettra de faire une passe globale de contrôle et d'envoyer la liste des problèmes avec ou sans paramètres et de laisser l'IHM s'occuper de formater le message par rapport à des fichiers properties.

    Bref, c'est un exemple parmi d'autres
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    502
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 502
    Points : 300
    Points
    300
    Par défaut
    Merci à vous pour ces réponses très complètes qui auront le mérite de donner de la matière à mes révisions. En effet les exception ne sont pas faciles à appréhender et sera l'objet de mes révisions pour la semaine prochaine.

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

Discussions similaires

  1. [NullReferenceException] propager l'exception ?
    Par Ticoche dans le forum Windows Forms
    Réponses: 8
    Dernier message: 02/01/2008, 16h07
  2. Propager une exception
    Par ploxien dans le forum Langage
    Réponses: 3
    Dernier message: 10/10/2007, 15h55
  3. [Exception] Propagation des exceptions
    Par Rayek dans le forum Langage
    Réponses: 5
    Dernier message: 03/08/2007, 16h59
  4. [C# 1.1] Comment propager l'exception ?
    Par Monstros Velu dans le forum C#
    Réponses: 3
    Dernier message: 17/06/2006, 13h32
  5. [Exceptions] propagation
    Par kisame dans le forum C++
    Réponses: 4
    Dernier message: 27/02/2006, 11h02

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