diff options
Diffstat (limited to 'files/fr/web/javascript/reference/statements/throw')
-rw-r--r-- | files/fr/web/javascript/reference/statements/throw/index.html | 202 |
1 files changed, 202 insertions, 0 deletions
diff --git a/files/fr/web/javascript/reference/statements/throw/index.html b/files/fr/web/javascript/reference/statements/throw/index.html new file mode 100644 index 0000000000..42ccbcdade --- /dev/null +++ b/files/fr/web/javascript/reference/statements/throw/index.html @@ -0,0 +1,202 @@ +--- +title: throw +slug: Web/JavaScript/Reference/Statements/throw +tags: + - Exception + - JavaScript + - Reference + - Statement +translation_of: Web/JavaScript/Reference/Statements/throw +original_slug: Web/JavaScript/Reference/Instructions/throw +--- +<div>{{jsSidebar("Statements")}}</div> + +<p>L'instruction <strong><code>throw</code></strong> permet de lever une exception définie par l'utilisateur. L'exécution de la fonction courante sera stoppée (les instructions situées après l'instruction <code>throw</code> ne seront pas exécutées) et le contrôle sera passé au premier bloc {{jsxref("Instructions/try...catch","catch")}} de la pile d'appels. Si aucun bloc <code>catch</code> ne se trouve dans les fonctions de la pile d'appels, le programme sera terminé.</p> + +<div>{{EmbedInteractiveExample("pages/js/statement-throw.html")}}</div> + +<p class="hidden">Le code source de cet exemple interactif est disponible dans un dépôt GitHub. Si vous souhaitez contribuez à ces exemples, n'hésitez pas à cloner <a href="https://github.com/mdn/interactive-examples">https://github.com/mdn/interactive-examples</a> et à envoyer une <em>pull request</em> !</p> + +<h2 id="Syntaxe">Syntaxe</h2> + +<pre class="syntaxbox">throw <em>expression</em>; </pre> + +<dl> + <dt><code>expression</code></dt> + <dd>L'expression qui fournit l'exception à lever.</dd> +</dl> + +<h2 id="Description">Description</h2> + +<p>L'instruction <code>throw</code> permet de lever (<em>throw</em> en anglais) une exception. Lorsqu'on lève une exception, <code>expression</code> fournit la valeur de l'exception. Chacune des instructions ci-après permet de lever une exception :</p> + +<pre class="brush: js">throw "monErreur"; // génère une exception étant une chaîne de caractères +throw 42; // génère une exception ayant la valeur 42 +throw true; // génère une exception ayant la valeur true +throw new Error("Obligatoire"); // génère un objet Error avec le message "Obligatoire"</pre> + +<p>On notera également que l'instruction <code>throw</code> est affectée par {{jsxref("Grammaire_lexicale","l'insertion automatique de point-virgule","#Insertion_automatique_de_points-virgules",1)}} car il n'est pas permis d'avoir un caractère de fin de ligne entre le mot-clé <code>throw</code> et l'expression.</p> + +<h2 id="Exemples">Exemples</h2> + +<h3 id="Lever_une_exception_qui_est_un_objet">Lever une exception qui est un objet</h3> + +<p>Il est possible de lever une exception qui est un objet et de faire référence aux propriétés de cet objet au sein du bloc <code>catch</code>. Dans l'exemple suivant, on crée un objet <code>monException</code> du type <code>ExceptionUtilisateur</code> puis on utilise cet objet avec une instruction <code>throw</code>.</p> + +<pre class="brush: js">function ExceptionUtilisateur(message) { + this.message = message; + this.name = "ExceptionUtilisateur"; +} +function getNomMois(mo) { + mo = mo-1; // Adjust month number for array index (1=Jan, 12=Dec) + var mois = ["Jan", "Fév", "Mar", "Avr", "Mai", "Juin", "Juil", + "Août", "Sept", "Oct", "Nov", "Déc"]; + if (mois[mo] !== undefined) { + return mois[mo]; + } else { + throw new ExceptionUtilisateur("Numéro de mois invalide"); + } +} + +try { + // les instructions à tenter + var monMois = 15; // 15 est en dehors des limites prévues + var nomMois = getNomMois(monMois); +} catch (e) { + nomMois = "unknown"; + console.error(e.message, e.name); // on passe les caractéristiques de l'exception + // à un gestionnaire d'erreur +} +</pre> + +<h3 id="Deuxième_exemple_avec_un_objet">Deuxième exemple avec un objet</h3> + +<p>Ici, on cherche à valider une chaîne de caractères représentant un code postal américain. Si le format utilisé est invalide, cela provoquera une exception avec un objet du type <code>ZipFormatIncorrectException</code>. (Le mot-clé {{jsxref("Instructions/const","const")}} introduit avec ECMAScript 6 est utilisé dans cet exemple).</p> + +<pre class="brush: js">/* + * Crée un objet ZipCode. + * + * Les formats acceptés sont : + * 12345 + * 12345-6789 + * 123456789 + * 12345 6789 + * + * Si l'argument passé au constructeur ZipCode n'est pas conforme + * à un de ces formats, une exception sera levée. + */ + +function ZipCode(zip) { + zip = new String(zip); + pattern = /[0-9]{5}([- ]?[0-9]{4})?/; + if (pattern.test(zip)) { + // la valeur du code sera la première correspondance + // dans la chaîne + this.value = zip.match(pattern)[0]; + this.valueOf = function() { + return this.value + }; + this.toString = function() { + return String(this.value) + }; + } else { + throw new ZipFormatIncorrectException(zip); + } +} + +function ZipFormatIncorrectException(value) { + this.value = value; + this.message = "le format n'est pas conforme"; + this.toString = function() { + return this.value + this.message; + }; +} + +/* + * Cette fonction pourrait être utilisée dans un script + * pour valider des adresses + */ + +const ZIPCODE_INVALID = -1; +const ZIPCODE_UNKNOWN_ERROR = -2; + +function vérifierZipCode(z) { + try { + z = new ZipCode(z); + } catch (e) { + if (e instanceof ZipFormatIncorrectException) { + return ZIPCODE_INVALID; + } else { + return ZIPCODE_UNKNOWN_ERROR; + } + } + return z; +} + +a = vérifierZipCode(95060); // renvoie 95060 +b = vérifierZipCode(9560); // renvoie -1 +c = vérifierZipCode("a"); // renvoie -1 +d = vérifierZipCode("95060"); // renvoie 95060 +e = vérifierZipCode("95060 1234"); // renvoie 95060 1234 +</pre> + +<h3 id="Propager_une_exception">Propager une exception</h3> + +<p>L'instruction <code>throw</code> peut être utilisée pour transmettre une exception qui aurait été interceptée avec {{jsxref("Instructions/try...catch","catch")}}. Dans l'exemple suivant, on intercepte une exception avec une valeur numérique et on propage l'exception si la valeur est supérieure à 50. L'exception qui est levée se propage dans la fonction appelante ou au niveau le plus haut, visible par l'utilisateur.</p> + +<pre class="brush: js">try { + throw n; // lève une exception avec une valeur numérique +} catch (e) { + if (e <= 50) { + // des instructions pour gérer les cas entre 1 et 50 + } else { + // ce cas ne peut pas être géré maintenant, on transmet l'exception + throw e; + } +} +</pre> + +<h2 id="Spécifications">Spécifications</h2> + +<table class="standard-table"> + <tbody> + <tr> + <th scope="col">Spécification</th> + <th scope="col">État</th> + <th scope="col">Commentaires</th> + </tr> + <tr> + <td>{{SpecName('ES3')}}</td> + <td>{{Spec2('ES3')}}</td> + <td>Définition initiale. Implémentée avec JavaScript 1.4</td> + </tr> + <tr> + <td>{{SpecName('ES5.1', '#sec-12.13', 'throw statement')}}</td> + <td>{{Spec2('ES5.1')}}</td> + <td></td> + </tr> + <tr> + <td>{{SpecName('ES6', '#sec-throw-statement', 'throw statement')}}</td> + <td>{{Spec2('ES6')}}</td> + <td></td> + </tr> + <tr> + <td>{{SpecName('ESDraft', '#sec-throw-statement', 'throw statement')}}</td> + <td>{{Spec2('ESDraft')}}</td> + <td></td> + </tr> + </tbody> +</table> + +<h2 id="Compatibilité_des_navigateurs">Compatibilité des navigateurs</h2> + +<div class="hidden">Ce tableau de compatibilité a été généré à partir de données structurées. Si vous souhaitez contribuer à ces données, n'hésitez pas à envoyer une <em>pull request</em> sur <a href="https://github.com/mdn/browser-compat-data">https://github.com/mdn/browser-compat-data</a>.</div> + +<p>{{Compat("javascript.statements.throw")}}</p> + +<h2 id="Voir_aussi">Voir aussi</h2> + +<ul> + <li>{{jsxref("Instructions/try...catch","try...catch")}}</li> + <li>{{jsxref("Error")}}</li> +</ul> |