Envoyé par
_skip
Le sujet a été débattu sur le forum best of des débats. Le C# offre la syntaxe "throw;" qui permet de propager une exception depuis un bloc catch sans perte de la stacktrace originale, et donc sans le besoin d'encapsulation.
Pour les cas ou je me fiche de savoir quel est le type de l'exception déclenché mais que je veux juste pouvoir déclencher un rollback ou effectuer un nettoyage (et c'est le cas 9 fois sur 10 dans ma BLL), c'est un gain en code et en lisibilité considérable.
En gros on peut faire un code du style :
1 2 3 4 5 6 7 8 9 10 11
| try
{
//code déclenchant une exception
}
catch(Exception ex)
{
if( !(ex is MonException1 || ex is MonException2 || ex is MonException3 ) )
throw;
//gérer un cas général d'exception ici, afficher un message etc...
} |
[/quote]
Désolé mais ceci est tout à fait possible en Java également, à une nuance syntaxique près puisqu'il faut faire suivre le throw par la référence de l'exception :
Envoyé par
_skip
Tu peux pas faire ce genre de chose, si tu essaies de relancer Exception, tu vas être obligé de mettre des catch( Exception ) partout sur toute les méthodes appelantes car Exception est une checked exception.
La différence est bien là ! En C# il n'y a pas de checked exception, contrairement à Java...
C'est un choix philosophique de ces deux langages, et chacun ayant ses avantages et ses défauts. Java force les développeurs à gérer les checked-exceptions, tandis qu'en C# on peut ignorer toutes les exception.
Mais perso cela importe peu car la qualité de la gestion des exception dépend du développeur et non pas du langage...
Envoyé par
_skip
Si tu fais throw ex, que ce soit en java ou en C#, tu perds une partie précieuse des informations de la pile, en fait ça donnera l'impression que c'est ton code de gestion d'erreur qui a déclenché l'exception, alors qu'en vérité c'est quelque chose dans le code du bloc try plus haut.
Faux, lorsque tu fais un throw l'exception est remonté tel quel et son stacktrace n'est pas modifié. Le stacktrace d'une exception est déterminé lors de sa création...
Ce n'est que lorsqu'on crée une nouvelle exception que l'on perd le stacktrace initiale, mais on utilise alors la forme suivante qui permet de passer l'exception cause :
throw new MonException("message", ex);
Envoyé par
_skip
-Tu peux tout à fait catcher exception du moment que tu fais une propagation en bonne et due forme et sans perte de l'information, java impose d'éviter ce genre de chose à cause des checked exceptions, mais dans d'autres langages c'est possible et tout à fait propre et sérieux.
La seule chose que Java impose, c'est de déclarer les checked-exception que l'on remonte...
a++
Partager