aboutsummaryrefslogtreecommitdiff
path: root/files/fr/web/javascript/reference/statements/throw/index.html
blob: 42ccbcdade8374e00a316cc9ab3f522af28e2847 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
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 &lt;= 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>