Vous avez raison.
Exceptions non vérifiées sont utilisés pour laisser le système faire des erreurs rapides ce qui est une bonne chose. Vous devez indiquer clairement ce que votre méthode attend pour fonctionner correctement. De cette façon, vous pouvez valider l'entrée une seule fois.
Par exemple :
/**
* @params operation - The operation to execute.
* @throws IllegalArgumentException if the operation is "exit"
*/
public final void execute( String operation ) {
if( "exit".equals(operation)){
throw new IllegalArgumentException("I told you not to...");
}
this.operation = operation;
.....
}
private void secretCode(){
// we perform the operation.
// at this point the opreation was validated already.
// so we don't worry that operation is "exit"
.....
}
Pour donner un exemple. Le fait est que, si le système échoue rapidement, vous saurez où et pourquoi il a échoué. Vous obtiendrez une trace de pile comme :
IllegalArgumentException: I told you not to use "exit"
at some.package.AClass.execute(Aclass.java:5)
at otherPackage.Otherlass.delegateTheWork(OtherClass.java:4569)
ar ......
Et vous saurez ce qui s'est passé. L'autre classe dans la méthode "delegateTheWork" (à la ligne 4569) a appelé votre classe avec la valeur "exit", même si elle ne devrait pas le faire, etc.
Sinon, vous devrez saupoudrer votre code de validations, ce qui est source d'erreurs. De plus, il est parfois difficile de savoir ce qui s'est mal passé et il faut s'attendre à des heures de débogage frustrantes.
La même chose se produit avec les exceptions NullPointerExceptions. Si vous avez une classe de 700 lignes avec 15 méthodes, qui utilise 30 attributs et qu'aucun d'entre eux ne peut être nul, au lieu de valider la nullité dans chacune de ces méthodes, vous pouvez rendre tous ces attributs en lecture seule et les valider dans le constructeur ou la méthode de fabrication.
public static MyClass createInstane( Object data1, Object data2 /* etc */ ){
if( data1 == null ){ throw NullPointerException( "data1 cannot be null"); }
}
// the rest of the methods don't validate data1 anymore.
public void method1(){ // don't worry, nothing is null
....
}
public void method2(){ // don't worry, nothing is null
....
}
public void method3(){ // don't worry, nothing is null
....
}
Exceptions vérifiées Ils sont utiles lorsque le programmeur (vous ou vos collègues) a fait tout ce qu'il fallait, validé l'entrée, exécuté des tests et que le code est parfait, mais qu'il se connecte à un service web tiers qui peut être hors service (ou qu'un fichier que vous utilisiez a été supprimé par un autre processus externe, etc. Le service web peut même être validé avant que la connexion ne soit tentée, mais pendant le transfert des données, quelque chose a mal tourné.
Dans ce cas, il n'y a rien que vous ou vos collègues puissiez faire pour l'aider. Mais vous devez quand même faire quelque chose et ne pas laisser l'application mourir et disparaître aux yeux de l'utilisateur. Vous utilisez une exception vérifiée pour cela et vous traitez l'exception, que pouvez-vous faire lorsque cela se produit ? la plupart du temps, vous essayez simplement d'enregistrer l'erreur, probablement de sauvegarder votre travail (le travail de l'application) et de présenter un message à l'utilisateur. ( Le site blabla est en panne, veuillez réessayer plus tard, etc.)
Si les exceptions vérifiées sont surutilisées ( en ajoutant "throw Exception" dans la signature de toutes les méthodes ), alors votre code deviendra très fragile, car tout le monde ignorera cette exception ( parce qu'elle est trop générale ) et la qualité du code sera sérieusement compromise.
Si vous abusez des exceptions non vérifiées, quelque chose de similaire se produira. Les utilisateurs de ce code ne savent pas si quelque chose peut mal tourner et beaucoup de try{...}catch( Throwable t ) vont apparaître.
14 votes
Barry Ruzek a écrit un excellent guide sur le choix des exceptions vérifiées ou non vérifiées.
0 votes
Ce lien peut vous aider à comprendre le concept même s'il est lié à nodejs joyent.com/node-js/production/design/errors