Voila tout est dans titre ?
J'ai une regle checkstyle m'interdisant de catcher une Exception de type
Throwable...
Je le soucis c'est que je ne comprends pas pourquoi cela n'est pas judicieux ?
merci
Version imprimable
Voila tout est dans titre ?
J'ai une regle checkstyle m'interdisant de catcher une Exception de type
Throwable...
Je le soucis c'est que je ne comprends pas pourquoi cela n'est pas judicieux ?
merci
parce que tu va catcher absolument tout. Non seulement les Exception auxquelles tu ne t'attends pas nécessairement et qui sont du à des erreurs de design (exemple des NullPointerException), ce qui pourrait encore être judicieux pour faire retomber ton code sur ses pattes +- dans tous les cas; mais tu va aussi catcher tous les Error (OutOfMemoryError, NoClassDefFoundError, ....) qui traduisent parfois des problèmes chroniques dans l'application, une situation catastrophique et un programme dans un état totalement instables. Ce checkstyle est là pour te dire "attention mon petit, si tu veux vraiment arrêter aussi les truc dangereux comme le OutOfMemoryError, montre moi vraiment que c'est ce que tu veux".
Mettre un catch(Throwable) ou un catch(Exception) juste pour 'pas se casser le cul', c'est souvent du mauvais design, car t'y va à la grosse louche et, comme pour la pêche au filet, t'as ton poisson mais tu ramasse aussi tous les dauphins et les méduses dont t'as pas besoin :D
Par règle "checkstyle" tu veux dire une convention de codage interne à ton équipe ? Je ne connais pas ce mot...
Catcher un Throwable n'est pas très judicieux dans le sens où ça catche tout et n'importe quoi, sans que tu puisses savoir ce qui s'est passé exactement...
Par exemple :
Tu peux penser, au vu du code, que dans tous les cas tu catcheras une MyException.Code:
1
2
3
4
5
6 try { throw new MyException(); } catch (Throwable e) { System.out.println("Erreur ! une exception MyException est survenue."); }
Mais si jamais une erreur que tu n'as pas prévue dans ton code intervenait (supposons qu'au lieu du throw bête et méchant de cet exemple il y ait un appel à une fonction plus complexe susceptible de lever une MyException, et que lors de l'exécution de cette fonction une RuntimeException soit levée) alors tu vas catcher cette exception et croire qu'il s'agit d'un cas d'erreur donné, alors que ce n'est pas le cas...
Il vaut donc mieux, pour être sûr de ce que l'on catche, être le plus précis possible dans la clause catch :
Ainsi une erreur non prévue ne sera pas "cachée" par un catch trop global.Code:
1
2
3
4
5
6 try { throw new MyException(); } catch (MyException e) { System.out.println("Erreur ! une exception MyException est survenue."); }
Par contre, un catch sur Throwable ne sera sans doute pas gênant si ensuite on relance l'exception :
Code:
1
2
3
4
5
6
7 try { throw new MyException(); } catch (Throwable e) { System.out.println("Erreur ! une exception est survenue."); throw e; }
Checkstyle est le nom d'un outil permettant de vérifier si un code se conforme à un certain nombre de normes de codage Java.
Oui bien sur il s'agit d'une convention de codage qu'on a dans le checkstyle.xml.
En tout cas c'es super clair
merci
OK, merci.
En effet ;)
J'avais dit "sans doute" parce que là comme ça dans ma tête je ne voyais pas de problème, mais c'est sûr que si on s'amusait à coder ça on s'en rendrait tout de suite compte, un "throws Throwable" je ne laisse pas passer ça !
[HS] et c'est pas juste pour parler, en ce moment je suis en pleine refonte d'un code produit en Inde où j'ai trouvé, entre autres bêtises, un beau throws Throwable et tout plein de catch (Exception e)...