Exceptions en Java

Gérer les cas exceptionnels

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

PHP offre quasiment la même gestion d'exceptions que Java. Peut-être la différence fondamentale repose sur le fait que ce dernier possède des contraintes liées à des exceptions. Autrement dit, il arrive qu'on ne puisse pas appeler une certaine méthode sans la capter dans le block try{} catch{}. Et tout cela est détecté déjà au moment de compilation.

Qu'est-ce que c'est une Exception en Java ?

La Machine Virtuelle du Java sait détecter au moment de compilation les erreurs liées au syntaxe du programme. Cependant, elle ne peut pas prévoir celles qui vont se produire pendant l'exécution du logiciel, suite à une mauvaise saisie de l'utilisateur ou à un problème du système. C'est dans cette situation où l'on va utiliser les exceptions.

Pour résumer, une exception concerne les problèmes qui se produisent d'une manière exceptionnelle que les développeur ne peut pas prévoir au moment de conception.

Les exceptions sont construites d'un block try{} catch{} (et éventuellement finally{} à la fin, pour être certain qu'un code sera toujours exécuté). Si l'on voulait traduire cela dans un langage plus humain, on pourrait dire que l'on place le code potentiellement dangereux (peut provoquer une exception) dans le block try{}. Il essaie de s'exécuter dans cet endroit. Cependant, si quelque chose ne se passe pas comme prévu (par exemple une variable est null tandis qu'elle ne devrait pas), on arrête l'interprétation du code dans try{} et on passe directement dans la patie catch{}. C'est là où l'on traite l'erreur reçue.

On peut également rajouter un nouveau block, finally{}. Il permet d'exécuter le code qui y est placé malgré une erreur captée. Ce block peut être utilisé par exemple pour fermer des connexions à la base de données ou à un URL.

Les exemples d'exceptions en Java

Voici quelques méthodes pour capter les exceptions en Java :

1. Dans le block de la méthode Le block try{} catch{} peut être placé directement dans la méthode.

afficher le code

Voici le résultat :

An exception occured null New name will be null

On remarque que le code placé derrière le block a été correctement exécuté.

2. Dans le block extérieur

Une méthode peut juste "retourner" une exception qui sera gérée par un block extérieur.

afficher le code

Voici le résultat :

An exception was catched null

3. Avec le block finally{}

Grâce à ce block le lecteur du buffeur sera fermé (à condition qu'il a été ouvert).

afficher le code

4. Gestion de plusieurs exceptions

On peut également gérer plusieurs types d'exceptions pour un seul block try{}.

afficher le code

5. Exception implicite

On peut également spécifier une exception plus personnalisée, par exemple quand une valeur ne correspond pas à ce qu'on attend.

afficher le code

Voici le résultat :

An exception was catched The name can't be one letter word Name after setName() is null

On voit que la valeur du name n'a pas été mis à jour à cause de l'exception captée.

Les exceptions sont donc une fonctionnalité qui nous permettra de mieux gérer le code dans les situations imprévues. Couplées avec un système de logs, elles rendront également possible une meilleure surveillance de l'application déjà sur place. Et tout cela malgré le fait d’alourdir la lecture du code.

télécharger les fichiers d'exemple
Bartosz KONIECZNY Informations sur le langage

Une question ? Une remarque ?

*

*

Un conseil Symfony2

Comment importer les routes ?

Parfois on a besoin de partager les routes en fonction de différents environnements (prod, dev / frontend, backend). Symfony2 gère ces cas très facilement. Pour pouvoir partager les routes il suffit tout simplement d'extraire les routes communes et de les importer par la suite. Dans notre exemple on a besoin de partager les routes qui définissent les requêtes AJAX. Pour ce faire, on va les sauvegarder dans le fichier routingAjax.yml, placé dans un bundle qui s'appelle RequestsAjaxBundle/Resource/config/routingAjax.yml. Alors, pour l'utiliser dans le fichier pour des routes de backend, il suffit de l'importer dans l'endroit voulu, comme ici :

# Ajax actions
ajaxRoutes:
    resource: "@RequestsAjaxBundle/Resources/config/routingAjax.yml"