05-Exceptions.html 64 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668
  1. <!DOCTYPE html>
  2. <html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
  3. <head>
  4. <meta charset="utf-8" />
  5. <meta name="generator" content="pandoc" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  7. <title>Les exceptions</title>
  8. <style type="text/css">
  9. code{white-space: pre-wrap;}
  10. span.smallcaps{font-variant: small-caps;}
  11. span.underline{text-decoration: underline;}
  12. div.column{display: inline-block; vertical-align: top; width: 50%;}
  13. </style>
  14. <style type="text/css">
  15. a.sourceLine { display: inline-block; line-height: 1.25; }
  16. a.sourceLine { pointer-events: none; color: inherit; text-decoration: inherit; }
  17. a.sourceLine:empty { height: 1.2em; position: absolute; }
  18. .sourceCode { overflow: visible; }
  19. code.sourceCode { white-space: pre; position: relative; }
  20. div.sourceCode { margin: 1em 0; }
  21. pre.sourceCode { margin: 0; }
  22. @media screen {
  23. div.sourceCode { overflow: auto; }
  24. }
  25. @media print {
  26. code.sourceCode { white-space: pre-wrap; }
  27. a.sourceLine { text-indent: -1em; padding-left: 1em; }
  28. }
  29. pre.numberSource a.sourceLine
  30. { position: relative; }
  31. pre.numberSource a.sourceLine:empty
  32. { position: absolute; }
  33. pre.numberSource a.sourceLine::before
  34. { content: attr(data-line-number);
  35. position: absolute; left: -5em; text-align: right; vertical-align: baseline;
  36. border: none; pointer-events: all;
  37. -webkit-touch-callout: none; -webkit-user-select: none;
  38. -khtml-user-select: none; -moz-user-select: none;
  39. -ms-user-select: none; user-select: none;
  40. padding: 0 4px; width: 4em;
  41. color: #aaaaaa;
  42. }
  43. pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
  44. div.sourceCode
  45. { }
  46. @media screen {
  47. a.sourceLine::before { text-decoration: underline; }
  48. }
  49. code span.al { color: #ff0000; font-weight: bold; } /* Alert */
  50. code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
  51. code span.at { color: #7d9029; } /* Attribute */
  52. code span.bn { color: #40a070; } /* BaseN */
  53. code span.bu { } /* BuiltIn */
  54. code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
  55. code span.ch { color: #4070a0; } /* Char */
  56. code span.cn { color: #880000; } /* Constant */
  57. code span.co { color: #60a0b0; font-style: italic; } /* Comment */
  58. code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
  59. code span.do { color: #ba2121; font-style: italic; } /* Documentation */
  60. code span.dt { color: #902000; } /* DataType */
  61. code span.dv { color: #40a070; } /* DecVal */
  62. code span.er { color: #ff0000; font-weight: bold; } /* Error */
  63. code span.ex { } /* Extension */
  64. code span.fl { color: #40a070; } /* Float */
  65. code span.fu { color: #06287e; } /* Function */
  66. code span.im { } /* Import */
  67. code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
  68. code span.kw { color: #007020; font-weight: bold; } /* Keyword */
  69. code span.op { color: #666666; } /* Operator */
  70. code span.ot { color: #007020; } /* Other */
  71. code span.pp { color: #bc7a00; } /* Preprocessor */
  72. code span.sc { color: #4070a0; } /* SpecialChar */
  73. code span.ss { color: #bb6688; } /* SpecialString */
  74. code span.st { color: #4070a0; } /* String */
  75. code span.va { color: #19177c; } /* Variable */
  76. code span.vs { color: #4070a0; } /* VerbatimString */
  77. code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
  78. </style>
  79. <link rel="stylesheet" href="pandoc.css">
  80. <!--[if lt IE 9]>
  81. <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  82. <![endif]-->
  83. </head>
  84. <body>
  85. <div class="doctitle">Les exceptions</div>
  86. <nav id="TOC">
  87. <ul>
  88. <li><a href="#les-exceptions">Les Exceptions</a><ul>
  89. <li><a href="#déroulement-dun-programme">Déroulement d’un programme</a></li>
  90. <li><a href="#traitement-des-événements-exceptionnels-en-java">Traitement des événements exceptionnels en Java</a></li>
  91. <li><a href="#exemples-de-code">Exemples de code</a><ul>
  92. <li><a href="#traitement-facultatif">Traitement facultatif</a></li>
  93. <li><a href="#traitement-imposé-à-la-compilation">Traitement imposé à la compilation</a></li>
  94. <li><a href="#exemple-readshort">Exemple : readShort</a></li>
  95. </ul></li>
  96. </ul></li>
  97. <li><a href="#gestion-des-exceptions">Gestion des exceptions</a><ul>
  98. <li><a href="#traitement-dans-la-méthode-où-lexception-se-produit">Traitement dans la méthode où l’exception se produit</a></li>
  99. <li><a href="#traitement-dans-la-méthode-appelante">Traitement dans la méthode appelante</a></li>
  100. </ul></li>
  101. <li><a href="#types-dexceptions">Types d’exceptions</a><ul>
  102. <li><a href="#le-type-throwable">Le type Throwable</a></li>
  103. <li><a href="#exceptions-non-vérifiées">Exceptions non vérifiées</a><ul>
  104. <li><a href="#runtime-exception">Runtime Exception</a></li>
  105. <li><a href="#error">Error</a></li>
  106. </ul></li>
  107. <li><a href="#exceptions-vérifiées">Exceptions vérifiées</a><ul>
  108. <li><a href="#exceptions-à-traiter-obligatoirement">Exceptions à traiter obligatoirement</a></li>
  109. <li><a href="#exemples-dévénements-anormaux">Exemples d’événements anormaux</a></li>
  110. </ul></li>
  111. <li><a href="#hiérarchie-de-classes">Hiérarchie de classes</a></li>
  112. </ul></li>
  113. <li><a href="#exemple-concret">Exemple concret</a></li>
  114. <li><a href="#création-et-levée-de-vos-propres-exceptions">Création et levée de vos propres exceptions</a><ul>
  115. <li><a href="#création-dexception">Création d’exception</a><ul>
  116. <li><a href="#création-dexception-1">Création d’exception</a></li>
  117. </ul></li>
  118. <li><a href="#levée-dexception">Levée d’exception</a><ul>
  119. <li><a href="#programme">Programme</a></li>
  120. <li><a href="#explications">Explications</a></li>
  121. </ul></li>
  122. </ul></li>
  123. <li><a href="#exercices">Exercices</a><ul>
  124. <li><a href="#calcul">Calcul</a></li>
  125. <li><a href="#le-nom-de-lexception">Le nom de l’exception</a></li>
  126. <li><a href="#factorielle">Factorielle</a></li>
  127. <li><a href="#gestion-de-mot-de-passe">Gestion de mot de passe</a></li>
  128. </ul></li>
  129. </ul>
  130. </nav>
  131. <h1 id="les-exceptions">Les Exceptions</h1>
  132. <h2 id="déroulement-dun-programme">Déroulement d’un programme</h2>
  133. <p>Lors de l’exécution d’un programme, on a une chaîne d’appel.</p>
  134. <div class="incremental">
  135. <p>Chaque élément de la chaîne est sollicité par un appelant (<code>caller</code>).</p>
  136. </div>
  137. <div class="incremental">
  138. <p>L’élément sollicité est nommé <em>appelé</em> (<code>callee</code>).</p>
  139. <p>L’exemple qui suit montre la lecture de données sur un support de stockage.</p>
  140. <figure>
  141. <img src="images/ExceptionsPileAppelReseau.png" alt="Déroulement normal d’un programme" /><figcaption>Déroulement normal d’un programme</figcaption>
  142. </figure>
  143. <p>A chaque niveau d’appel, un problème peut survenir.</p>
  144. <figure>
  145. <img src="images/ExceptionsPileAppelReseauErreurs.png" alt="Erreurs possibles" /><figcaption>Erreurs possibles</figcaption>
  146. </figure>
  147. <p>Quelle décision doit prendre un élément <em>appelé</em> quant au traitement du problème ?</p>
  148. <ul>
  149. <li>Peut-il continuer l’exécution du programme comme si rien ne s’était passé ?
  150. <ul>
  151. <li>dans ce cas il risque de compromettre le bon fonctionnement de son appelant</li>
  152. </ul></li>
  153. <li>Comment prévenir l’appelant que son exécution ne s’est pas déroulée correctement ? quel mécanisme utiliser pour renvoyer ?
  154. <ul>
  155. <li>une valeur indiquant une erreur</li>
  156. <li>un événement inattendu ?</li>
  157. </ul></li>
  158. </ul>
  159. <p>Et de tous les appelants de la chaîne, quel est celui qui doit traiter l’événement exceptionnel ?</p>
  160. <p>Java propose un mécanisme puissant permettant de gérer tous ces cas de figure</p>
  161. </div>
  162. <h2 id="traitement-des-événements-exceptionnels-en-java">Traitement des événements exceptionnels en Java</h2>
  163. <p>Les exceptions sont des anomalies susceptibles de se produire dans un programme Java, écartant celui—ci du comportement normal ou souhaité.</p>
  164. <p>On dit alors qu’une exception est <strong>levée</strong>.</p>
  165. <p>Les origines des exceptions sont diverses :</p>
  166. <ul>
  167. <li>manque de mémoire,</li>
  168. <li>division par zéro,</li>
  169. <li>tentative d’ouverture d’un fichier inexistant,</li>
  170. <li>etc.</li>
  171. </ul>
  172. <p>Le comportement à adopter sera différent suivant la nature des exceptions.</p>
  173. <p>Le compilateur Java impose la gestion des exceptions lorsque vous tentez d’utiliser des méthodes prévoyants des exceptions.</p>
  174. <p><strong>Par exemple</strong>, la méthode <a href="https://docs.oracle.com/javase/8/docs/api/java/io/DataInputStream.html"><code>readShort</code> de la classe <code>DataInputStream</code></a> qui lit depuis un fichier peut éventuellement lever des exceptions <code>IOException</code>; elle est donc définie avec un modificateur spécial <code>throws</code> qui signale ces erreurs potentielles.</p>
  175. <div class="sourceCode" id="cb1"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb1-1" data-line-number="1"></a>
  176. <a class="sourceLine" id="cb1-2" data-line-number="2"><span class="kw">public</span> <span class="dt">final</span> <span class="dt">short</span> <span class="fu">readShort</span>() <span class="kw">throws</span> <span class="bu">IOException</span></a></code></pre></div>
  177. <h2 id="exemples-de-code">Exemples de code</h2>
  178. <h3 id="traitement-facultatif">Traitement facultatif</h3>
  179. <p>Un exemple d’exception dont le traitement n’est pas imposé :</p>
  180. <div class="sourceCode" id="cb2"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb2-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> ExceptionDemo {</a>
  181. <a class="sourceLine" id="cb2-2" data-line-number="2"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testTableau</span>(){</a>
  182. <a class="sourceLine" id="cb2-3" data-line-number="3"> <span class="dt">int</span>[] tableauEntier = <span class="kw">new</span> <span class="dt">int</span>[<span class="dv">5</span>];</a>
  183. <a class="sourceLine" id="cb2-4" data-line-number="4"> tableauEntier[<span class="dv">6</span>] = <span class="dv">12</span>; <span class="co">//On est en dehors des limites du tableau</span></a>
  184. <a class="sourceLine" id="cb2-5" data-line-number="5"> }</a>
  185. <a class="sourceLine" id="cb2-6" data-line-number="6"></a>
  186. <a class="sourceLine" id="cb2-7" data-line-number="7"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
  187. <a class="sourceLine" id="cb2-8" data-line-number="8"> <span class="kw">new</span> <span class="fu">ExceptionDemo</span>().<span class="fu">testTableau</span>(); <span class="co">//ArrayIndexOutOfBoundsException</span></a>
  188. <a class="sourceLine" id="cb2-9" data-line-number="9"> }</a>
  189. <a class="sourceLine" id="cb2-10" data-line-number="10">}</a></code></pre></div>
  190. <h3 id="traitement-imposé-à-la-compilation">Traitement imposé à la compilation</h3>
  191. <p>Un exemple d’exception dont le traitement est imposé par le compilateur:</p>
  192. <div class="sourceCode" id="cb3"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb3-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.io.File;</span></a>
  193. <a class="sourceLine" id="cb3-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.io.FileInputStream;</span></a>
  194. <a class="sourceLine" id="cb3-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> ExceptionDemo {</a>
  195. <a class="sourceLine" id="cb3-4" data-line-number="4"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">testFichier</span>(){</a>
  196. <a class="sourceLine" id="cb3-5" data-line-number="5"> <span class="bu">File</span> file = <span class="kw">new</span> <span class="bu">File</span>(<span class="st">&quot;NExistePas.txt&quot;</span>);</a>
  197. <a class="sourceLine" id="cb3-6" data-line-number="6"> <span class="co">//Ci-dessous: ERREUR de COMPILATION</span></a>
  198. <a class="sourceLine" id="cb3-7" data-line-number="7"> <span class="co">//Unhandled exception type FileNotFoundException ExceptionDemo.java</span></a>
  199. <a class="sourceLine" id="cb3-8" data-line-number="8"> <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(file);</a>
  200. <a class="sourceLine" id="cb3-9" data-line-number="9"> }</a>
  201. <a class="sourceLine" id="cb3-10" data-line-number="10"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
  202. <a class="sourceLine" id="cb3-11" data-line-number="11"> <span class="kw">new</span> <span class="fu">ExceptionDemo</span>().<span class="fu">testFichier</span>();</a>
  203. <a class="sourceLine" id="cb3-12" data-line-number="12"> }</a>
  204. <a class="sourceLine" id="cb3-13" data-line-number="13">}</a></code></pre></div>
  205. <h3 id="exemple-readshort">Exemple : readShort</h3>
  206. <p>Cet exemple montre la méthode <code>readShort</code> lève une exception:</p>
  207. <div class="sourceCode" id="cb4"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb4-1" data-line-number="1"><span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
  208. <a class="sourceLine" id="cb4-2" data-line-number="2"></a>
  209. <a class="sourceLine" id="cb4-3" data-line-number="3">FileInputstream fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
  210. <a class="sourceLine" id="cb4-4" data-line-number="4"><span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis,(<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
  211. <a class="sourceLine" id="cb4-5" data-line-number="5"><span class="bu">DataInputStream</span> dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
  212. <a class="sourceLine" id="cb4-6" data-line-number="6"></a>
  213. <a class="sourceLine" id="cb4-7" data-line-number="7"><span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>(); <span class="co">//Levée d&#39;IOException</span></a></code></pre></div>
  214. <p>La méthode <code>readshort</code> est définie comme suit :</p>
  215. <div class="sourceCode" id="cb5"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb5-1" data-line-number="1"><span class="kw">public</span> <span class="dt">final</span> <span class="dt">short</span> <span class="fu">readShort</span>() <span class="kw">throws</span> <span class="bu">IOException</span></a></code></pre></div>
  216. <p>En Java on est obligé de traiter les exceptions dans le code, sinon il ne peut être compilé et le message suivant est affiché :</p>
  217. <pre><code>Exception java.lang.InterruptedException
  218. must be caught or it must be declared in the throws clause of this method.</code></pre>
  219. <p>La méthode <code>readShort</code> levant une exception, le code de l’exemple précédent ne passe pas à la compilation.</p>
  220. <h1 id="gestion-des-exceptions">Gestion des exceptions</h1>
  221. <p>Lorsqu’une exception est levée, le déroulement du code est interrompu et le traitement des exceptions consiste alors à rechercher quelles dispositions prendre.</p>
  222. <p>Au niveau de la programmation, il est possible de prévoir deux modes de codage :</p>
  223. <ol type="1">
  224. <li>Soit la méthode dont le code a été interrompu dispose des informations suffisantes</li>
  225. </ol>
  226. <p>pour corriger certaines anomalies observées</p>
  227. <pre><code>(ou bien pour émettre des messages d’erreur explicites).</code></pre>
  228. <p>Dans ce cas, la méthode décide de traiter elle-même certaines exceptions dans des <em>blocs <code>catch</code></em> associés à un <em>bloc <code>try</code></em>.</p>
  229. <ol start="2" type="1">
  230. <li>Soit la méthode concernée ne dispose pas elle-même des informations suffisantes</li>
  231. </ol>
  232. <p>pour traiter certains types d’exceptions,</p>
  233. <pre><code>mais les méthodes appelantes peuvent disposer de ces informations.</code></pre>
  234. <p>Dans ce cas les exceptions sont déclarées dans la <em>clause <code>throws</code></em> de la signature de la méthode afin que les méthodes appelantes soient informées des types d’exccptions susceptibles d’être levées par une méthode.</p>
  235. <h2 id="traitement-dans-la-méthode-où-lexception-se-produit">Traitement dans la méthode où l’exception se produit</h2>
  236. <p>Reprenons l’exemple précédent :</p>
  237. <div class="sourceCode" id="cb9"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb9-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename ) {</a>
  238. <a class="sourceLine" id="cb9-2" data-line-number="2"> <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
  239. <a class="sourceLine" id="cb9-3" data-line-number="3"></a>
  240. <a class="sourceLine" id="cb9-4" data-line-number="4"> FileInputstream fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
  241. <a class="sourceLine" id="cb9-5" data-line-number="5"> BufferedInputstream bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis,(<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
  242. <a class="sourceLine" id="cb9-6" data-line-number="6"> DataInputstream dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
  243. <a class="sourceLine" id="cb9-7" data-line-number="7"></a>
  244. <a class="sourceLine" id="cb9-8" data-line-number="8"> <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>();</a>
  245. <a class="sourceLine" id="cb9-9" data-line-number="9"> <span class="co">//...</span></a>
  246. <a class="sourceLine" id="cb9-10" data-line-number="10">}</a></code></pre></div>
  247. <p>La première étape consiste à inclure le code susceptible de lever des exceptions dans un <em>bloc <code>try { ... }</code></em></p>
  248. <p>A un <em>bloc <code>try</code></em> doivent être associées une ou plusieurs <em>clauses <code>catch</code></em> et éventuellement un <em>bloc <code>finally</code></em>.</p>
  249. <div class="sourceCode" id="cb10"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb10-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename ) {</a>
  250. <a class="sourceLine" id="cb10-2" data-line-number="2"> <span class="kw">try</span> {</a>
  251. <a class="sourceLine" id="cb10-3" data-line-number="3"> <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
  252. <a class="sourceLine" id="cb10-4" data-line-number="4"> <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
  253. <a class="sourceLine" id="cb10-5" data-line-number="5"> <span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis,(<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
  254. <a class="sourceLine" id="cb10-6" data-line-number="6"> <span class="bu">DataInputStream</span> dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
  255. <a class="sourceLine" id="cb10-7" data-line-number="7"> <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>();</a>
  256. <a class="sourceLine" id="cb10-8" data-line-number="8"> }</a>
  257. <a class="sourceLine" id="cb10-9" data-line-number="9"> <span class="kw">catch</span> ( <span class="bu">Exception</span> e ) {</a>
  258. <a class="sourceLine" id="cb10-10" data-line-number="10"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot; exception: &quot;</span> + e.<span class="fu">getMessage</span>());</a>
  259. <a class="sourceLine" id="cb10-11" data-line-number="11"> e.<span class="fu">printStackTrace</span>();</a>
  260. <a class="sourceLine" id="cb10-12" data-line-number="12"> }</a>
  261. <a class="sourceLine" id="cb10-13" data-line-number="13">}</a></code></pre></div>
  262. <p>Ou plus finement (il est <strong>toujours préférable</strong> de gérer les exceptions selon leur type) :</p>
  263. <div class="sourceCode" id="cb11"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb11-1" data-line-number="1"><span class="kw">import</span><span class="im"> java.io.BufferedInputStream;</span></a>
  264. <a class="sourceLine" id="cb11-2" data-line-number="2"><span class="kw">import</span><span class="im"> java.io.DataInputStream;</span></a>
  265. <a class="sourceLine" id="cb11-3" data-line-number="3"><span class="kw">import</span><span class="im"> java.io.File;</span></a>
  266. <a class="sourceLine" id="cb11-4" data-line-number="4"><span class="kw">import</span><span class="im"> java.io.FileInputStream;</span></a>
  267. <a class="sourceLine" id="cb11-5" data-line-number="5"><span class="kw">import</span><span class="im"> java.io.FileNotFoundException;</span></a>
  268. <a class="sourceLine" id="cb11-6" data-line-number="6"><span class="kw">import</span><span class="im"> java.io.IOException;</span></a>
  269. <a class="sourceLine" id="cb11-7" data-line-number="7"><span class="kw">public</span> <span class="kw">class</span> GestionExceptionProgramme {</a>
  270. <a class="sourceLine" id="cb11-8" data-line-number="8"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename ) {</a>
  271. <a class="sourceLine" id="cb11-9" data-line-number="9"> <span class="bu">DataInputStream</span> dis = <span class="kw">null</span>;</a>
  272. <a class="sourceLine" id="cb11-10" data-line-number="10"> <span class="kw">try</span> {</a>
  273. <a class="sourceLine" id="cb11-11" data-line-number="11"> <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
  274. <a class="sourceLine" id="cb11-12" data-line-number="12"> <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
  275. <a class="sourceLine" id="cb11-13" data-line-number="13"> <span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis,(<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
  276. <a class="sourceLine" id="cb11-14" data-line-number="14"> dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
  277. <a class="sourceLine" id="cb11-15" data-line-number="15"> <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span> () ;</a>
  278. <a class="sourceLine" id="cb11-16" data-line-number="16"> }</a>
  279. <a class="sourceLine" id="cb11-17" data-line-number="17"> <span class="kw">catch</span> ( <span class="bu">FileNotFoundException</span> f ) { <span class="co">// sous—classe de IOException</span></a>
  280. <a class="sourceLine" id="cb11-18" data-line-number="18"> <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(<span class="st">&quot;exception: &quot;</span> + f.<span class="fu">getMessage</span>());</a>
  281. <a class="sourceLine" id="cb11-19" data-line-number="19"> f.<span class="fu">printStackTrace</span>();</a>
  282. <a class="sourceLine" id="cb11-20" data-line-number="20"> }</a>
  283. <a class="sourceLine" id="cb11-21" data-line-number="21"> <span class="kw">catch</span> ( <span class="bu">IOException</span> e ) { <span class="co">// sous—classe de Exception</span></a>
  284. <a class="sourceLine" id="cb11-22" data-line-number="22"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;exception: &quot;</span> + e.<span class="fu">getMessage</span>());</a>
  285. <a class="sourceLine" id="cb11-23" data-line-number="23"> e.<span class="fu">printStackTrace</span>();</a>
  286. <a class="sourceLine" id="cb11-24" data-line-number="24"> }</a>
  287. <a class="sourceLine" id="cb11-25" data-line-number="25"> <span class="kw">finally</span> { <span class="co">//Ferme proprement le fichier</span></a>
  288. <a class="sourceLine" id="cb11-26" data-line-number="26"> <span class="kw">try</span> {</a>
  289. <a class="sourceLine" id="cb11-27" data-line-number="27"> <span class="kw">if</span> (dis != <span class="kw">null</span>){ dis.<span class="fu">close</span>(); }</a>
  290. <a class="sourceLine" id="cb11-28" data-line-number="28"> } <span class="kw">catch</span> (<span class="bu">IOException</span> e) {</a>
  291. <a class="sourceLine" id="cb11-29" data-line-number="29"> e.<span class="fu">printStackTrace</span>();</a>
  292. <a class="sourceLine" id="cb11-30" data-line-number="30"> }</a>
  293. <a class="sourceLine" id="cb11-31" data-line-number="31"> }</a>
  294. <a class="sourceLine" id="cb11-32" data-line-number="32"> }</a>
  295. <a class="sourceLine" id="cb11-33" data-line-number="33"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) {</a>
  296. <a class="sourceLine" id="cb11-34" data-line-number="34"> <span class="kw">new</span> <span class="fu">GestionExceptionProgramme</span>()</a>
  297. <a class="sourceLine" id="cb11-35" data-line-number="35"> .<span class="fu">lireImageRGB</span>(<span class="st">&quot;UnFichierInexistant.jpg&quot;</span>);</a>
  298. <a class="sourceLine" id="cb11-36" data-line-number="36"> }</a>
  299. <a class="sourceLine" id="cb11-37" data-line-number="37">}</a></code></pre></div>
  300. <p>Le <em>bloc <code>try</code></em> commence avant la ligne <code>File f = new File(filename);</code> car le constructeur de la classe <code>File</code> peut lui aussi lever une exception de type <code>NullPointerException</code>, dans le cas où le nom de fichier passé en paramètre est égal à <code>null</code>.</p>
  301. <p>Si une exception se produit dans un <em>bloc <code>try</code></em>, l’exécution de code est interrompue et les <em>clauses <code>catch</code></em> qui lui sont associées sont examinées dans l’ordre pour chercher si l’unc d’elles a prévu un traitement de l’exception produite. Les <em>clauses <code>catch</code></em> sont comme des méthodes recevant un seul argument.</p>
  302. <p>Si une <em>clause <code>catch</code></em> correspond à l’exception, elle prend le contrôle de l’exécution.</p>
  303. <p>Le code d’un bloc associé à une <em>clause <code>finally</code></em> est exécuté dans tous les cas, soit après une exécution normale du <em>bloc <code>try</code></em> soit après traitement d’une exception</p>
  304. <h2 id="traitement-dans-la-méthode-appelante">Traitement dans la méthode appelante</h2>
  305. <p>Pour indiquer que l’<code>Exception</code> n’est pas gérée dans la méthode <code>lireImageRGB()</code> et que par conséquent, elle le sera dans la méthode appelante, on utilise la <em>clause <code>throws</code></em>.</p>
  306. <p>Reprenons l’exemple précédent :</p>
  307. <div class="sourceCode" id="cb12"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb12-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename ) <span class="kw">throws</span> <span class="bu">Exception</span> {</a>
  308. <a class="sourceLine" id="cb12-2" data-line-number="2"></a>
  309. <a class="sourceLine" id="cb12-3" data-line-number="3"> <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
  310. <a class="sourceLine" id="cb12-4" data-line-number="4"></a>
  311. <a class="sourceLine" id="cb12-5" data-line-number="5"> <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
  312. <a class="sourceLine" id="cb12-6" data-line-number="6"> <span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis, (<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
  313. <a class="sourceLine" id="cb12-7" data-line-number="7"> <span class="bu">DataInputStream</span> dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
  314. <a class="sourceLine" id="cb12-8" data-line-number="8"></a>
  315. <a class="sourceLine" id="cb12-9" data-line-number="9"> <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>();</a>
  316. <a class="sourceLine" id="cb12-10" data-line-number="10"></a>
  317. <a class="sourceLine" id="cb12-11" data-line-number="11">}</a></code></pre></div>
  318. <p>ou plus finement</p>
  319. <div class="sourceCode" id="cb13"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb13-1" data-line-number="1"><span class="kw">public</span> <span class="dt">void</span> <span class="fu">lireImageRGB</span>(<span class="bu">String</span> filename )</a>
  320. <a class="sourceLine" id="cb13-2" data-line-number="2"> <span class="kw">throws</span> <span class="bu">FileNotFoundException</span>,</a>
  321. <a class="sourceLine" id="cb13-3" data-line-number="3"> <span class="bu">IOException</span> {</a>
  322. <a class="sourceLine" id="cb13-4" data-line-number="4"></a>
  323. <a class="sourceLine" id="cb13-5" data-line-number="5"> <span class="bu">File</span> f = <span class="kw">new</span> <span class="bu">File</span>(filename);</a>
  324. <a class="sourceLine" id="cb13-6" data-line-number="6"> <span class="bu">FileInputStream</span> fis = <span class="kw">new</span> <span class="bu">FileInputStream</span>(f);</a>
  325. <a class="sourceLine" id="cb13-7" data-line-number="7"> <span class="bu">BufferedInputStream</span> bis = <span class="kw">new</span> <span class="bu">BufferedInputStream</span>(fis, (<span class="dt">int</span>)f.<span class="fu">length</span>());</a>
  326. <a class="sourceLine" id="cb13-8" data-line-number="8"> <span class="bu">DataInputStream</span> dis = <span class="kw">new</span> <span class="bu">DataInputStream</span>(bis);</a>
  327. <a class="sourceLine" id="cb13-9" data-line-number="9"> <span class="dt">short</span> magicNumber = dis.<span class="fu">readShort</span>();</a>
  328. <a class="sourceLine" id="cb13-10" data-line-number="10">}</a></code></pre></div>
  329. <h1 id="types-dexceptions">Types d’exceptions</h1>
  330. <h2 id="le-type-throwable">Le type Throwable</h2>
  331. <p>Une exception est un objet (instance d’une classe qui hérite de la classe <code>Throwable</code>) qui possède des données et des méthodes membres.</p>
  332. <figure>
  333. <img src="images/ClassesException.png" alt="La classe Exception" /><figcaption>La classe <code>Exception</code></figcaption>
  334. </figure>
  335. <p><code>Throwable</code> a deux sous-classes : <code>Error</code> et <code>Exception</code>.</p>
  336. <p>Les instances d’<code>Error</code> sont des erreurs internes de l’environnement d’exécution Java (la machine virtuelle). Ces erreurs sont rares, et habituellement fatales; ces exceptions ne doivent pas être levées, ni capturées dans un programme.</p>
  337. <p>Les sous-classes d’<code>Exception</code> sont réparties entre deux catégories :</p>
  338. <h2 id="exceptions-non-vérifiées">Exceptions non vérifiées</h2>
  339. <h3 id="runtime-exception">Runtime Exception</h3>
  340. <p>Un bloc <code>try/catch</code> n’est pas imposé pour traiter ces exceptions</p>
  341. <ul>
  342. <li>Les exceptions d’exécution (<em>runtime exceptions</em>), sous-classes de la classe <code>RuntimeException</code> telles que:
  343. <ul>
  344. <li>ArrayIndexOutOfBoundsException</li>
  345. <li>SecurityException,</li>
  346. <li>ou NullPointerException.</li>
  347. </ul>
  348. <p>Ces exceptions sont généralement liées à un défaut de robustesse du code.</p>
  349. <p>Mettre des <code>try/catch</code> pour ces exceptions rendrait le code illisible.</p></li>
  350. </ul>
  351. <h3 id="error">Error</h3>
  352. <p>Les erreurs font parties des objets Throwables non vérifiés:</p>
  353. <ul>
  354. <li>il n’est pas imposé d’écrire un bloc <code>try...catch</code> pour les gérer</li>
  355. </ul>
  356. <h2 id="exceptions-vérifiées">Exceptions vérifiées</h2>
  357. <h3 id="exceptions-à-traiter-obligatoirement">Exceptions à traiter obligatoirement</h3>
  358. <p>Bloc <code>try/catch</code> obligatoire</p>
  359. <ul>
  360. <li>Exceptions qui correspondent à des évènements <em>anormaux</em>, échappant au contrôle du programme</li>
  361. </ul>
  362. <h3 id="exemples-dévénements-anormaux">Exemples d’événements anormaux</h3>
  363. <ul>
  364. <li><code>EOFException</code>
  365. <ul>
  366. <li>se produit lorsque vous lisez dans un fichier</li>
  367. <li>et que celui-ci se termine prématurément.</li>
  368. </ul></li>
  369. </ul>
  370. <h2 id="hiérarchie-de-classes">Hiérarchie de classes</h2>
  371. <p>La hiérarchie des exceptions est comme celle des autres classes, les super-classes correspondant à des erreurs plus générales, et les sous-classes à des erreurs plus spécifiques.</p>
  372. <p>La plupart des exceptions font partie du package <code>java.lang</code> (qui inclut <code>Throwable</code>, <code>Exception</code> et <code>RuntimeException</code>). Mais un grand nombre d’autres packages définissent d’autres exceptions, et ces exceptions sont utilisées dans toute la bibliothèque de classes.</p>
  373. <p><strong>Par exemple</strong></p>
  374. <p>Le package <code>java.io</code> définit une classe générale d’exceptions appelée <code>IOException</code>, qui est sous-classée non seulement dans le package <code>java.io</code> pour les exceptions (d’entrée et de sortie (<code>EOFException</code>, <code>FileNotFoundException</code>), mais aussi dans les classes du package <code>java.net</code> pour les exceptions de réseau telles que <code>MalFormedURLException</code>.</p>
  375. <p>Ci dessous, est représentée une partie de la hiérarchie des exceptions.</p>
  376. <div class="nonincremental">
  377. <ul>
  378. <li><p><code>java.lang.Exception</code></p>
  379. <ul>
  380. <li><code>java.lang.ClassNotFoundException</code></li>
  381. <li><code>java.lang.CloneNotSupportedException</code></li>
  382. <li><code>java.lang.IllegalAccessException</code></li>
  383. <li><code>java.lang.InstantiationException</code></li>
  384. <li><code>java.lang.InterruptedException</code></li>
  385. <li><code>java.lang.NoSuchFieldException</code></li>
  386. <li><code>java.lang.NoSuchMethodException</code></li>
  387. <li><p><code>java.lang.RuntimeException</code></p>
  388. <ul>
  389. <li><code>java.lang.ArithmeticException</code></li>
  390. <li><code>java.lang.ArrayStoreException</code></li>
  391. <li><code>java.lang.ClassCastException</code></li>
  392. <li><code>java.lang.IllegalArgumentException</code>
  393. <ul>
  394. <li><code>java.lang.NumberFormatException</code></li>
  395. </ul></li>
  396. <li><code>java.lang.IllegalMonitorStateException</code></li>
  397. <li><code>java.lang.IllegalStateException</code></li>
  398. <li><code>java.lang.IndexOutOfBoundsException</code>
  399. <ul>
  400. <li><code>java.lang.ArrayIndexOutOfBoundsException</code></li>
  401. <li><code>java.lang.StringIndexOutOfBoundsException</code></li>
  402. </ul></li>
  403. <li><code>java.lang.NegativeArraySizeException</code></li>
  404. <li><code>java.lang.NullPointerException</code></li>
  405. <li><code>java.lang.SecurityException</code></li>
  406. <li><code>java.lang.UnsupportedOperationException</code></li>
  407. </ul></li>
  408. <li><p><code>java.io.IOException</code></p>
  409. <ul>
  410. <li><code>java.io.CharConversionException</code></li>
  411. <li><code>java.io.FileNotFoundException</code></li>
  412. <li><code>java.io.InterruptedIOException</code></li>
  413. <li><code>java.io.ObjectStreamException</code></li>
  414. </ul></li>
  415. </ul></li>
  416. </ul>
  417. </div>
  418. <h1 id="exemple-concret">Exemple concret</h1>
  419. <p>Prenons l’exemple suivant :</p>
  420. <div class="sourceCode" id="cb14"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb14-1" data-line-number="1"></a>
  421. <a class="sourceLine" id="cb14-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> ExceptionCatch {</a>
  422. <a class="sourceLine" id="cb14-3" data-line-number="3"> <span class="dt">int</span> <span class="fu">moyenne</span>(<span class="bu">String</span>[] liste) {</a>
  423. <a class="sourceLine" id="cb14-4" data-line-number="4"> <span class="dt">int</span> somme = <span class="dv">0</span>, entier, nbNotes = <span class="dv">0</span>;</a>
  424. <a class="sourceLine" id="cb14-5" data-line-number="5"> <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; liste.<span class="fu">length</span>;i++) {</a>
  425. <a class="sourceLine" id="cb14-6" data-line-number="6"> <span class="kw">try</span> {</a>
  426. <a class="sourceLine" id="cb14-7" data-line-number="7"> entier = <span class="bu">Integer</span>.<span class="fu">parseInt</span>(liste[i]);</a>
  427. <a class="sourceLine" id="cb14-8" data-line-number="8"> somme += entier;</a>
  428. <a class="sourceLine" id="cb14-9" data-line-number="9"> nbNotes++;</a>
  429. <a class="sourceLine" id="cb14-10" data-line-number="10"> }</a>
  430. <a class="sourceLine" id="cb14-11" data-line-number="11"> <span class="kw">catch</span> (<span class="bu">NumberFormatException</span> e) {</a>
  431. <a class="sourceLine" id="cb14-12" data-line-number="12"> <span class="kw">if</span> ( i == <span class="dv">0</span> ) {</a>
  432. <a class="sourceLine" id="cb14-13" data-line-number="13"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;La 1ere note n&#39;est pas entiere&quot;</span>);</a>
  433. <a class="sourceLine" id="cb14-14" data-line-number="14"> }</a>
  434. <a class="sourceLine" id="cb14-15" data-line-number="15"> <span class="kw">else</span> {</a>
  435. <a class="sourceLine" id="cb14-16" data-line-number="16"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;La &quot;</span>+(i+<span class="dv">1</span>)+<span class="st">&quot;eme note n&#39;est pas entiere&quot;</span>);</a>
  436. <a class="sourceLine" id="cb14-17" data-line-number="17"> }</a>
  437. <a class="sourceLine" id="cb14-18" data-line-number="18"> }</a>
  438. <a class="sourceLine" id="cb14-19" data-line-number="19"> }</a>
  439. <a class="sourceLine" id="cb14-20" data-line-number="20"> <span class="kw">return</span> somme/nbNotes;</a>
  440. <a class="sourceLine" id="cb14-21" data-line-number="21"> }</a>
  441. <a class="sourceLine" id="cb14-22" data-line-number="22"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] argv) {</a>
  442. <a class="sourceLine" id="cb14-23" data-line-number="23"> <span class="bu">String</span>[] liste = {<span class="st">&quot;1&quot;</span>, <span class="st">&quot;5&quot;</span>, <span class="st">&quot;toto&quot;</span>};</a>
  443. <a class="sourceLine" id="cb14-24" data-line-number="24"></a>
  444. <a class="sourceLine" id="cb14-25" data-line-number="25"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(</a>
  445. <a class="sourceLine" id="cb14-26" data-line-number="26"> <span class="st">&quot;La moyenne est &quot;</span> + <span class="kw">new</span> <span class="fu">ExceptionCatch</span>().<span class="fu">moyenne</span>(liste));</a>
  446. <a class="sourceLine" id="cb14-27" data-line-number="27"> }</a>
  447. <a class="sourceLine" id="cb14-28" data-line-number="28">}</a></code></pre></div>
  448. <p>On obtient en sortie:</p>
  449. <pre><code>La 3eme note n&#39;est pas entiere
  450. La moyenne est 3</code></pre>
  451. <p>Si on remplace la ligne</p>
  452. <div class="sourceCode" id="cb16"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb16-1" data-line-number="1"><span class="bu">String</span>[] liste = {<span class="st">&quot;1&quot;</span>, <span class="st">&quot;5&quot;</span>, <span class="st">&quot;toto&quot;</span>};</a></code></pre></div>
  453. <p>Par</p>
  454. <div class="sourceCode" id="cb17"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb17-1" data-line-number="1"><span class="bu">String</span>[] liste = {<span class="st">&quot;toto&quot;</span>, <span class="st">&quot;15.5&quot;</span>};</a></code></pre></div>
  455. <p>On obtient:</p>
  456. <pre><code>La 1ere note n&#39;est pas entiere
  457. La 2eme note n&#39;est pas entiere
  458. Exception in thread &quot;main&quot; java.lang.ArithmeticException: / by zero
  459. at ExceptionCatch.moyenne(ExceptionCatch.java:20)
  460. at ExceptionCatch.main(ExceptionCatch.java:26)</code></pre>
  461. <p>Dans cet exemple deux types d’exceptions peuvent être levées :</p>
  462. <ul>
  463. <li><code>java.lang.NumberFormatException</code> : lancée par la méthode parseInt: de la classe Integer si la chaine de caractères <code>liste[i]</code> ne correspond pas à un entier. Les instructions suivantes ne sont alors pas effectuées. Ici donc, si <code>liste[i]</code> ne décrit pas un entier, les deux instructions qui suivent :</li>
  464. </ul>
  465. <div class="sourceCode" id="cb19"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb19-1" data-line-number="1"> somme+=entier;</a>
  466. <a class="sourceLine" id="cb19-2" data-line-number="2"> nbNotes++;</a></code></pre></div>
  467. <p>ne sont pas effectuées, et on passe à l’instruction <code>println</code> intérieure au “<em>bloc <code>catch</code></em>”, puis on remonte dans la “boucle for” qui reprend son déroulement.</p>
  468. <ul>
  469. <li><code>java.lang.ArithmeticException</code> : si <code>nbNotes</code> vaut 0, une exception, instance de <code>java.lang.ArithmeticException</code> est lancée.</li>
  470. </ul>
  471. <p>Celle—ci n’étant pas attrapée, elle se propage alors jusqu’à la fin du programme, comme on peut le constater sur le deuxième exemple d’exécution.</p>
  472. <p>Mais seule l’exception <code>java.lang.NumberFormatException</code> doit être obligatoirement traitée, soit localement (c’est le cas ici), soit dans la méthode appelante. En effet la méthode <code>parseInt</code> prévoyant cette exception, le compilateur oblige la gestion de l’exception dans le code.</p>
  473. <h1 id="création-et-levée-de-vos-propres-exceptions">Création et levée de vos propres exceptions</h1>
  474. <h2 id="création-dexception">Création d’exception</h2>
  475. <p>Il est possible pour le programmeur de créer ses propres classes d’exception en héritant soit de la classe <code>Exception</code> (sommet de la hiérarchie des classes explicites), soit en cherchant une exception plus proche de celle que l’on veut créer. Par exemple : une exception pour un mauvais format de fichier doit normalement être une <code>IOException</code>.</p>
  476. <p>Les classes d’exceptions ont typiquement deux constructeurs : le premier ne prend pas d’argument, et le second prend une seule chaîne comme argument. Dans le second, vous devez appeler <code>super()</code> dans le constructeur pour vous assurer que la chaine est utilisée au bon endroit dans l’exception.</p>
  477. <p>Les classes d’exceptions ont le même aspect que d’autres classes. Vous pouvez les placer dans leur propres fichiers source et les compiler comme n’importe quelles autres classes.</p>
  478. <h3 id="création-dexception-1">Création d’exception</h3>
  479. <div class="sourceCode" id="cb20"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb20-1" data-line-number="1"><span class="kw">public</span> <span class="kw">class</span> NotesNonValidesException <span class="kw">extends</span> <span class="bu">Exception</span> {</a>
  480. <a class="sourceLine" id="cb20-2" data-line-number="2"></a>
  481. <a class="sourceLine" id="cb20-3" data-line-number="3"> <span class="kw">public</span> <span class="fu">NotesNonValidesException</span>(<span class="bu">String</span> message) {</a>
  482. <a class="sourceLine" id="cb20-4" data-line-number="4"> <span class="co">// message sera utilisé</span></a>
  483. <a class="sourceLine" id="cb20-5" data-line-number="5"> <span class="kw">super</span>(message); <span class="co">// par la méthode getMessage()</span></a>
  484. <a class="sourceLine" id="cb20-6" data-line-number="6"> }</a>
  485. <a class="sourceLine" id="cb20-7" data-line-number="7"></a>
  486. <a class="sourceLine" id="cb20-8" data-line-number="8"> <span class="kw">public</span> <span class="bu">String</span> <span class="fu">toString</span>() {</a>
  487. <a class="sourceLine" id="cb20-9" data-line-number="9"> <span class="co">// Rappel : cette méthode permet</span></a>
  488. <a class="sourceLine" id="cb20-10" data-line-number="10"> <span class="co">// de convertir l&#39;objet en une</span></a>
  489. <a class="sourceLine" id="cb20-11" data-line-number="11"> <span class="kw">return</span>(<span class="st">&quot;Aucune note n&#39;est valide&quot;</span>); <span class="co">// chaîne de caractères</span></a>
  490. <a class="sourceLine" id="cb20-12" data-line-number="12"> }</a>
  491. <a class="sourceLine" id="cb20-13" data-line-number="13">}</a></code></pre></div>
  492. <h2 id="levée-dexception">Levée d’exception</h2>
  493. <p>L’exception est levée dans le code à l’aide de la <em>clause <code>throw</code></em>.</p>
  494. <p>Reprenons l’exemple précédent (<code>ExceptionCatch</code>). Imaginons que nous voulions éviter, l’exception <code>java.lang.ArithmeticException</code>.</p>
  495. <p>Une solution consiste à tester si <code>nbNotes == 0</code>, avant d’effectuer le calcul de la moyenne et à signaler le problème en levant l’exception créée précédemment (<code>NotesNonValidesException</code>).</p>
  496. <h3 id="programme">Programme</h3>
  497. <div class="sourceCode" id="cb21"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb21-1" data-line-number="1"></a>
  498. <a class="sourceLine" id="cb21-2" data-line-number="2"><span class="kw">public</span> <span class="kw">class</span> TraiterNotes {</a>
  499. <a class="sourceLine" id="cb21-3" data-line-number="3"> <span class="dt">static</span> <span class="dt">int</span> <span class="fu">moyenne</span>(<span class="bu">String</span>[] liste) <span class="kw">throws</span> NotesNonValidesException {</a>
  500. <a class="sourceLine" id="cb21-4" data-line-number="4"> <span class="dt">int</span> somme = <span class="dv">0</span>,entier, nbNotes = <span class="dv">0</span>;</a>
  501. <a class="sourceLine" id="cb21-5" data-line-number="5"> <span class="kw">for</span> (<span class="dt">int</span> i = <span class="dv">0</span>; i &lt; liste.<span class="fu">length</span>;i++){</a>
  502. <a class="sourceLine" id="cb21-6" data-line-number="6"> <span class="kw">try</span> {</a>
  503. <a class="sourceLine" id="cb21-7" data-line-number="7"> entier = <span class="bu">Integer</span>.<span class="fu">parseInt</span>(liste[i]);</a>
  504. <a class="sourceLine" id="cb21-8" data-line-number="8"> somme += entier;</a>
  505. <a class="sourceLine" id="cb21-9" data-line-number="9"> nbNotes++;</a>
  506. <a class="sourceLine" id="cb21-10" data-line-number="10"> }</a>
  507. <a class="sourceLine" id="cb21-11" data-line-number="11"> <span class="kw">catch</span> (<span class="bu">NumberFormatException</span> e) {</a>
  508. <a class="sourceLine" id="cb21-12" data-line-number="12"> <span class="bu">String</span> msg = <span class="st">&quot;n&#39;est pas entiere&quot;</span>;</a>
  509. <a class="sourceLine" id="cb21-13" data-line-number="13"> <span class="kw">if</span> (i == <span class="dv">0</span>) {</a>
  510. <a class="sourceLine" id="cb21-14" data-line-number="14"> msg = <span class="st">&quot;La 1ere note &quot;</span> + msg ;}</a>
  511. <a class="sourceLine" id="cb21-15" data-line-number="15"> <span class="kw">else</span>{ msg = <span class="st">&quot;La &quot;</span>+(i+<span class="dv">1</span>)+<span class="st">&quot; note &quot;</span> + msg ;}</a>
  512. <a class="sourceLine" id="cb21-16" data-line-number="16"> }</a>
  513. <a class="sourceLine" id="cb21-17" data-line-number="17"> }</a>
  514. <a class="sourceLine" id="cb21-18" data-line-number="18"> <span class="kw">if</span> (nbNotes == <span class="dv">0</span>){ <span class="kw">throw</span> <span class="kw">new</span> <span class="fu">NotesNonValidesException</span>(<span class="st">&quot;Dommage&quot;</span>); }</a>
  515. <a class="sourceLine" id="cb21-19" data-line-number="19"></a>
  516. <a class="sourceLine" id="cb21-20" data-line-number="20"> <span class="kw">return</span> somme/nbNotes;</a>
  517. <a class="sourceLine" id="cb21-21" data-line-number="21"> }</a>
  518. <a class="sourceLine" id="cb21-22" data-line-number="22"></a>
  519. <a class="sourceLine" id="cb21-23" data-line-number="23"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] argv) {</a>
  520. <a class="sourceLine" id="cb21-24" data-line-number="24"> <span class="kw">try</span> {</a>
  521. <a class="sourceLine" id="cb21-25" data-line-number="25"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;La moyenne est &quot;</span>+<span class="fu">moyenne</span>(argv));</a>
  522. <a class="sourceLine" id="cb21-26" data-line-number="26"> }</a>
  523. <a class="sourceLine" id="cb21-27" data-line-number="27"> <span class="kw">catch</span> (NotesNonValidesException e) {</a>
  524. <a class="sourceLine" id="cb21-28" data-line-number="28"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(e);</a>
  525. <a class="sourceLine" id="cb21-29" data-line-number="29"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(e.<span class="fu">getMessage</span>());</a>
  526. <a class="sourceLine" id="cb21-30" data-line-number="30"> }</a>
  527. <a class="sourceLine" id="cb21-31" data-line-number="31"> }</a>
  528. <a class="sourceLine" id="cb21-32" data-line-number="32">}</a></code></pre></div>
  529. <p>Pour :</p>
  530. <pre><code>java TraiterNotes ha 15.5</code></pre>
  531. <p>On obtient :</p>
  532. <pre><code>La 1ere note n&#39;est: pas entière
  533. La 2eme note n&#39;est pas entiere
  534. Aucune note n&#39;est valide
  535. Dommage</code></pre>
  536. <h3 id="explications">Explications</h3>
  537. <h5 id="throws-notesnonvalidesexception">throws NotesNonvalidesException</h5>
  538. <p>La méthode <code>moyenne</code> indique ainsi qu’il est possible qu’une de ses instructions envoie une exception de type <code>NotesNonValidesException</code> sans que celle-ci soit attrapée par un mécanisme <code>try</code>-<code>catch</code>.</p>
  539. <p>Il est obligatoire d’indiquer ainsi un éventuel lancement d’exception non attrapée, sauf pour les exceptions les plus courantes de l‘API (<code>RuntimeException</code>). Si vous oubliez de signaler par la <em>clause <code>throws</code></em> l’éventualité d’un tel lancement d’exception, le compilateur vous le rappelera.</p>
  540. <h5 id="throw-new-notesnonvalidesexception">throw new NotesNonvalidesException()</h5>
  541. <p>On demande ainsi le lancement d’une instance de <code>NotesNonvalidesException</code>. Une fois lancée, l’exception se propagera comme expliqué dans l’exemple précédent.</p>
  542. <p>Ici, il y aura sortie de la méthode <code>moyenne</code>, on se retrouve alors à l’appel de la la méthode <code>moyenne</code> dans le main, appel qui se trouve dans un <em>bloc <code>try</code></em> suivi d’un <em>bloc <code>catch</code></em> qui attrape les <code>NotesNonValidesException</code> :</p>
  543. <ul>
  544. <li>l’instruction de ce <em>bloc <code>catch</code></em> est effectuée.</li>
  545. <li>Le programme reprend alors son cours normal (pour se terminer).</li>
  546. </ul>
  547. <h1 id="exercices">Exercices</h1>
  548. <h2 id="calcul">Calcul</h2>
  549. <p>Reprendre le programme gérant les opérations mathématique (les sources sont disponibles <a href="data/ch3-Calculs.zip">ici</a>.</p>
  550. <p>Ajoutez l’opération de <code>Division</code></p>
  551. <p>Celle-ci devra lever une exception de division par zéro (nouvelle classe <code>DivisionParZeroException</code>). Bien choisir sa classe parente afin d’avoir un minimum de modifications à faire sur l’ensemble des classes (peut-être y a-t-il déjà une classe pouvant correspondre à ce type d’erreur dans l’API Java ?).</p>
  552. <p>Tester ce programme en rajoutant une clause <code>catch</code> permettant d’afficher un message concernant l’erreur à l’utilisateur.</p>
  553. <h2 id="le-nom-de-lexception">Le nom de l’exception</h2>
  554. <p>Prenez les codes suivants et analysez-les:</p>
  555. <ol type="1">
  556. <li>renommer les exceptions en leur donnant un nom plus explicite.</li>
  557. <li>déterminer comment lancer le programme sans qu’une erreur ne se produise depuis Eclipse (aller pour cela dans le menu <code>Run &gt; Run Configurations...</code> puis dans l’onglet <code>Arguments</code>)</li>
  558. <li>que pensez-vous de la déclaration de la méthode <code>main</code> ? En quoi est-il utile d’indiquer la clause <code>throws</code> ici ?</li>
  559. <li>modifier le code pour que la méthode <code>main</code> traite l’exception</li>
  560. </ol>
  561. <p>Classes E1:</p>
  562. <div class="sourceCode" id="cb24"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb24-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.exception;</span></a>
  563. <a class="sourceLine" id="cb24-2" data-line-number="2"></a>
  564. <a class="sourceLine" id="cb24-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> E1 <span class="kw">extends</span> <span class="bu">Exception</span> {</a>
  565. <a class="sourceLine" id="cb24-4" data-line-number="4"> <span class="kw">public</span> <span class="fu">E1</span>(<span class="bu">String</span> mess) {</a>
  566. <a class="sourceLine" id="cb24-5" data-line-number="5"> <span class="kw">super</span>(mess);</a>
  567. <a class="sourceLine" id="cb24-6" data-line-number="6"> }</a>
  568. <a class="sourceLine" id="cb24-7" data-line-number="7">}</a></code></pre></div>
  569. <p>Classe E2:</p>
  570. <div class="sourceCode" id="cb25"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb25-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.exception;</span></a>
  571. <a class="sourceLine" id="cb25-2" data-line-number="2"></a>
  572. <a class="sourceLine" id="cb25-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> E2 <span class="kw">extends</span> <span class="bu">Exception</span> {</a>
  573. <a class="sourceLine" id="cb25-4" data-line-number="4"> <span class="kw">public</span> <span class="fu">E2</span>(<span class="bu">String</span> mess) {</a>
  574. <a class="sourceLine" id="cb25-5" data-line-number="5"> <span class="kw">super</span>(mess);</a>
  575. <a class="sourceLine" id="cb25-6" data-line-number="6"> }</a>
  576. <a class="sourceLine" id="cb25-7" data-line-number="7">}</a></code></pre></div>
  577. <p>Classe <code>AutoDivision</code> :</p>
  578. <div class="sourceCode" id="cb26"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb26-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.exception;</span></a>
  579. <a class="sourceLine" id="cb26-2" data-line-number="2"></a>
  580. <a class="sourceLine" id="cb26-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> AutoDivision {</a>
  581. <a class="sourceLine" id="cb26-4" data-line-number="4"> <span class="kw">private</span> <span class="dt">double</span> x;</a>
  582. <a class="sourceLine" id="cb26-5" data-line-number="5"></a>
  583. <a class="sourceLine" id="cb26-6" data-line-number="6"> <span class="kw">public</span> <span class="fu">AutoDivision</span>(<span class="dt">double</span> x) {</a>
  584. <a class="sourceLine" id="cb26-7" data-line-number="7"> <span class="kw">this</span>.<span class="fu">x</span> = x;</a>
  585. <a class="sourceLine" id="cb26-8" data-line-number="8"> }</a>
  586. <a class="sourceLine" id="cb26-9" data-line-number="9"></a>
  587. <a class="sourceLine" id="cb26-10" data-line-number="10"> <span class="kw">public</span> <span class="dt">double</span> <span class="fu">getX</span>() {</a>
  588. <a class="sourceLine" id="cb26-11" data-line-number="11"> <span class="kw">return</span> x;</a>
  589. <a class="sourceLine" id="cb26-12" data-line-number="12"> }</a>
  590. <a class="sourceLine" id="cb26-13" data-line-number="13"></a>
  591. <a class="sourceLine" id="cb26-14" data-line-number="14"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">calculer</span>(<span class="dt">double</span> y) <span class="kw">throws</span> E1,E2 {</a>
  592. <a class="sourceLine" id="cb26-15" data-line-number="15"> <span class="kw">if</span> (y == <span class="dv">0</span>){</a>
  593. <a class="sourceLine" id="cb26-16" data-line-number="16"> <span class="kw">throw</span> <span class="kw">new</span> <span class="fu">E1</span>(<span class="st">&quot;Paramètre nul: le paramètre ne peut être égal à zéro&quot;</span>);</a>
  594. <a class="sourceLine" id="cb26-17" data-line-number="17"> }</a>
  595. <a class="sourceLine" id="cb26-18" data-line-number="18"> <span class="kw">if</span> (x * y &lt; <span class="dv">0</span>){</a>
  596. <a class="sourceLine" id="cb26-19" data-line-number="19"> <span class="kw">throw</span> <span class="kw">new</span> <span class="fu">E2</span>(<span class="st">&quot;paramètre de signe opposé à x&quot;</span>);</a>
  597. <a class="sourceLine" id="cb26-20" data-line-number="20"> }</a>
  598. <a class="sourceLine" id="cb26-21" data-line-number="21"> x = x / y;</a>
  599. <a class="sourceLine" id="cb26-22" data-line-number="22"> }</a>
  600. <a class="sourceLine" id="cb26-23" data-line-number="23"></a>
  601. <a class="sourceLine" id="cb26-24" data-line-number="24"> <span class="kw">public</span> <span class="dt">void</span> <span class="fu">executer</span>(<span class="dt">double</span> y) <span class="kw">throws</span> E1 {</a>
  602. <a class="sourceLine" id="cb26-25" data-line-number="25"> <span class="kw">try</span> {</a>
  603. <a class="sourceLine" id="cb26-26" data-line-number="26"> <span class="fu">calculer</span>(y);</a>
  604. <a class="sourceLine" id="cb26-27" data-line-number="27"> }</a>
  605. <a class="sourceLine" id="cb26-28" data-line-number="28"> <span class="kw">catch</span> (E2 e) {</a>
  606. <a class="sourceLine" id="cb26-29" data-line-number="29"> <span class="bu">System</span>.<span class="fu">err</span>.<span class="fu">println</span>(e.<span class="fu">getMessage</span>());</a>
  607. <a class="sourceLine" id="cb26-30" data-line-number="30"> }</a>
  608. <a class="sourceLine" id="cb26-31" data-line-number="31"> }</a>
  609. <a class="sourceLine" id="cb26-32" data-line-number="32"></a>
  610. <a class="sourceLine" id="cb26-33" data-line-number="33"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">void</span> <span class="fu">main</span>(<span class="bu">String</span>[] args) <span class="kw">throws</span> E1 {</a>
  611. <a class="sourceLine" id="cb26-34" data-line-number="34"> AutoDivision ad = <span class="kw">new</span> <span class="fu">AutoDivision</span>(<span class="bu">Double</span>.<span class="fu">parseDouble</span>(args[<span class="dv">0</span>]));</a>
  612. <a class="sourceLine" id="cb26-35" data-line-number="35"> ad.<span class="fu">executer</span>(<span class="bu">Double</span>.<span class="fu">parseDouble</span>(args[<span class="dv">1</span>]));</a>
  613. <a class="sourceLine" id="cb26-36" data-line-number="36"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;x = &quot;</span> + ad.<span class="fu">getX</span>());</a>
  614. <a class="sourceLine" id="cb26-37" data-line-number="37"> ad.<span class="fu">executer</span>(<span class="bu">Double</span>.<span class="fu">parseDouble</span>(args[<span class="dv">2</span>]));</a>
  615. <a class="sourceLine" id="cb26-38" data-line-number="38"> <span class="bu">System</span>.<span class="fu">out</span>.<span class="fu">println</span>(<span class="st">&quot;x = &quot;</span> + ad.<span class="fu">getX</span>());</a>
  616. <a class="sourceLine" id="cb26-39" data-line-number="39"> }</a>
  617. <a class="sourceLine" id="cb26-40" data-line-number="40">}</a></code></pre></div>
  618. <h2 id="factorielle">Factorielle</h2>
  619. <p>Voici une classe de calcul de factorielle:</p>
  620. <div class="sourceCode" id="cb27"><pre class="sourceCode java"><code class="sourceCode java"><a class="sourceLine" id="cb27-1" data-line-number="1"><span class="kw">package</span><span class="im"> com.example.maths;</span></a>
  621. <a class="sourceLine" id="cb27-2" data-line-number="2"></a>
  622. <a class="sourceLine" id="cb27-3" data-line-number="3"><span class="kw">public</span> <span class="kw">class</span> Fonctions {</a>
  623. <a class="sourceLine" id="cb27-4" data-line-number="4"> <span class="kw">private</span> <span class="dt">static</span> <span class="dt">long</span> <span class="fu">factorielleT</span>(<span class="dt">long</span> n, <span class="dt">long</span> acc){</a>
  624. <a class="sourceLine" id="cb27-5" data-line-number="5"> <span class="kw">if</span>(n &lt;= <span class="dv">1</span>){</a>
  625. <a class="sourceLine" id="cb27-6" data-line-number="6"> <span class="kw">return</span> acc;</a>
  626. <a class="sourceLine" id="cb27-7" data-line-number="7"> }</a>
  627. <a class="sourceLine" id="cb27-8" data-line-number="8"> <span class="kw">else</span>{</a>
  628. <a class="sourceLine" id="cb27-9" data-line-number="9"> <span class="kw">return</span> <span class="fu">factorielleT</span>(n - <span class="dv">1</span>, n * acc);</a>
  629. <a class="sourceLine" id="cb27-10" data-line-number="10"> }</a>
  630. <a class="sourceLine" id="cb27-11" data-line-number="11"> }</a>
  631. <a class="sourceLine" id="cb27-12" data-line-number="12"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">long</span> <span class="fu">factorielle</span>(<span class="dt">long</span> n){</a>
  632. <a class="sourceLine" id="cb27-13" data-line-number="13"> <span class="kw">return</span> <span class="fu">factorielleT</span>(n, <span class="dv">1</span>);</a>
  633. <a class="sourceLine" id="cb27-14" data-line-number="14"> }</a>
  634. <a class="sourceLine" id="cb27-15" data-line-number="15"> <span class="kw">public</span> <span class="dt">static</span> <span class="dt">long</span> <span class="fu">factorielle</span>(<span class="dt">long</span> n){</a>
  635. <a class="sourceLine" id="cb27-16" data-line-number="16"> <span class="kw">return</span> <span class="fu">factorielleT</span>(n, <span class="dv">1</span>);</a>
  636. <a class="sourceLine" id="cb27-17" data-line-number="17"> }</a>
  637. <a class="sourceLine" id="cb27-18" data-line-number="18">}</a></code></pre></div>
  638. <p>Créer les exceptions permettant de gérer deux cas d’erreur:</p>
  639. <ul>
  640. <li>Le nombre passé en paramètre est négatif : <code>NombreNegatifException</code></li>
  641. <li>Le nombre passé en paramètre est trop grand : <code>NombreTropGrandException</code></li>
  642. </ul>
  643. <p>Modifier les méthodes afin de prendre en compte ces exceptions.</p>
  644. <p>A vous de déterminer la valeur maximale pouvant être traitée par cette fonction (les constantes <code>Long.MAX_VALUE</code> et <code>Integer.MAX_VALUE</code> peuvent vous aider). Dans ce cas, il est possible aussi que le nombre retourné devienne négatif : comment faire alors ?</p>
  645. <h2 id="gestion-de-mot-de-passe">Gestion de mot de passe</h2>
  646. <p>Parmi les failles de sécurité réseau, on trouve notamment l’utilisation du dépassement.</p>
  647. <p>Par exemple, sur certaines programmes, un <em>login</em> ou un mot de passe de plus d’un mega-octet peut le faire <em>planter</em>. Ceci donne alors un accès <code>root</code> au système.</p>
  648. <p>Dans d’autre cas, il est possible de faire une injection SQL.</p>
  649. <p>Vous allez écrire un programme capable de gérer ces problèmes avec différents types d’exception.</p>
  650. <ol type="1">
  651. <li>Écrire un programme qui demande en boucle un nom d’utilisateur (<code>login</code>) et un mot de passe (<code>password</code>) jusqu’à recevoir une paire <code>login</code>/<code>password</code> correcte</li>
  652. </ol>
  653. <p>Vous stockerez les données de connexion suivantes en dur dans ce programme: <code>duke</code>/<code>Ellington</code> et <code>alexander</code>/<code>Abreu</code>.</p>
  654. <ol start="2" type="1">
  655. <li>Implémenter les exceptions suivantes:</li>
  656. </ol>
  657. <ul>
  658. <li><code>IncorrectLoginException</code> : levée lorsque l’utilisateur saisit un <code>login</code> inexistant</li>
  659. <li><code>IncorrectPasswordException</code> : levée lorsque le mot de passe est erroné</li>
  660. <li><code>IncorrectInputLengthException</code> : levée lorsque le login ou le mot de passe saisi dépasse 10 caractères</li>
  661. <li><code>SQLInjectionException</code> : levée lorsque le <code>login</code> ou le mot de passe saisi contient un caractère ‘;’ suivi du mot clef <code>SELECT</code> (avec ou sans espaces intermédiaires)</li>
  662. </ul>
  663. <ol start="3" type="1">
  664. <li>Implémenter de façon à utiliser ces exceptions de façon pertinente pour pouvoir tracer ces exceptions. Ainsi, la <code>SQLInjectionException</code> ne devra pas faire l’objet d’un affichage standard d’erreur (l’attaquant ne doit pas savoir que le système sait détecter les injections SQL)</li>
  665. <li>Déterminer les autres cas où l’on pourrait lever la <code>SQLInjectionException</code></li>
  666. </ol>
  667. </body>
  668. </html>