Forum Programmation.java Assertions vs. Exceptions

Posté par .
Tags : aucun
2
18
oct.
2008
Bonjour à tous,

alors voilà : j'aimerais connaître vos avis concernant l'utilisation des assertions en Java (parce que je code en java, mais la question est sans doute indépendante des langages) : quelle est la valeur ajoutée des assertions par rapport aux exceptions ?

je veux dire : les assertions sont utilisées dans les pré-conditions, pour vérifier qu'une valeur reçue est cohérente (pas 'null', pas négative, ni trop petite ni trop grande... selon le cas).
Mais tout ceci est tout aussi faisable avec des exceptions, d'où mon interrogation à ce sujet.

Ainsi, un code comme :

public void setXXX( XXX x )
{
if( x == null )
{
throw new NullPointerException( "bla bla bla" );
}

this._x = x;
}


deviendrait :

public void setXXX( XXX x )
{
assert x != null : "bla bla bla";

this._x = x;
}


le rendant de suite plus court sans pour autant rogner sur les vérifications. Mais est-ce le seul gain ?
  • # Sémantique

    Posté par (page perso) . Évalué à 10.

    Tout est dans la sémantique.

    Les assertions sont là pour vérifier des choses qui ne peuvent pas arriver. Lorsqu'une assertion est fausse c'est un bug. Elles sont faites pour êtres désactivables.

    Les exceptions sont là pour traiter les cas particuliers, des choses qui ne sont pas prévues, mais qui peuvent arriver. Elles ne sont pas désactivables. Et participent au bon fonctionnement du programme.
    • [^] # Re: Sémantique

      Posté par . Évalué à 2.

      Par exemple, typiquement une erreur d'IO ça peut être traîté par une exception. C'est pas un bug du programme, c'est un truc qui peut arriver.


      Pour ton "setXXX" c'est un bug: t'as un "con" qui n'a pas vérifié la précondition, c'est un bug qui fout la merde dans le programme, à priori t'as pas forcément envie de continuer le programme après ça (et de toute façon si tu le fais t'as de la chance si tout se casse pas la gueule peu de temps après même si ton programme est prévu pour).

      Tu l'arrêtes, tu lances un débugger, et tu examines la pile d'appel, ce qui est de mon expérience pas toujours aussi simple avec une exception rattrapée.
    • [^] # Re: Sémantique

      Posté par . Évalué à 1.

      De plus les assertions génèrent en fin de compte des erreurs (AssertionError).
      Les erreurs se propagent comme des exceptions, mais ne peuvent/devraient pas être catchées.

      Il est rare que les exceptions se propagent jusque au plus haut et arrêtent le programme. Les erreurs arrêtent le programme.
  • # Différence de taille

    Posté par (page perso) . Évalué à 3.

    Je rajouterai par rapport aux autres commentaires que quand on passe d'un mode "debug" à un mode "release" (troll : il doit y avoir les deux modes dans tout langage correct :) ), les assertions sont supprimées (accélération du code). Les assertions servent à debugger ton code (tu appelles une fonction interne sans avoir fait une condition préalable), les exceptions servent à gérer les problèmes extérieurs (l'utilisateur qui rentre des conneries, un accès disque qui foire, une API publique mal utilisée...).

    Bref, pour résumer
    - Assertion = test si connerie de toi
    - Exception = test si connerie des autres
  • # Merci

    Posté par . Évalué à 2.

    Oki, pour toutes vos réponses :-)
    • [^] # Re: Merci

      Posté par . Évalué à 2.

      J'ai inversé "Oki" et "Merci"

      -_-

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.