You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/10-error-handling/2-custom-errors/article.md
+21-20Lines changed: 21 additions & 20 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,8 +1,8 @@
1
-
# Les erreurs personnalisées, Étendre Error
1
+
# Les erreurs personnalisées, extension de Error
2
2
3
3
Lorsque nous développons quelque chose, nous avons souvent besoin de nos propres classes d'erreur pour refléter des problèmes spécifiques qui peuvent mal tourner dans nos tâches. Pour les erreurs dans les opérations réseau, nous aurons peut-être besoin de `HttpError`, pour les opérations de base de données `DbError`, pour les opérations de recherche `NotFoundError`, etc.
4
4
5
-
Nos erreurs devraient prendre en charge des propriétés d'erreur de base telles que `message`, `name` et, de préférence, `stack`. Mais elles peuvent aussi avoir d’autres propriétés propres, par exemple Les objets `HttpError` peuvent avoir une propriété `statusCode` avec une valeur telle que `404` ou `403` ou `500`.
5
+
Nos erreurs devraient prendre en charge des propriétés d'erreur de base telles que `message`, `name` et, de préférence, `stack`. Mais elles peuvent aussi avoir d’autres propriétés propres, par exemple les objets `HttpError` peuvent avoir une propriété `statusCode` avec une valeur telle que `404` ou `403` ou `500`.
6
6
7
7
JavaScript permet d'utiliser `throw` avec n'importe quel argument. Par conséquent, techniquement, nos classes d'erreur personnalisées n'ont pas besoin d'hériter de `Error`. Mais si nous héritons, il devient alors possible d'utiliser `obj instanceof Error` pour identifier les objets d'erreur. Il vaut donc mieux en hériter.
8
8
@@ -12,12 +12,13 @@ Au fur et à mesure que l'application grandit, nos propres erreurs forment natur
12
12
13
13
A titre d'exemple, considérons une fonction `readUser(json)` qui devrait lire JSON avec des données utilisateur.
14
14
15
-
Voici un exemple de l'apparence d'un `json` valide:
15
+
Voici un exemple de l'apparence d'un `json` valide :
16
+
16
17
```js
17
18
let json =`{ "name": "John", "age": 30 }`;
18
19
```
19
20
20
-
En interne, nous utiliserons `JSON.parse`. S'il reçoit un `json` malformé, il renvoie`SyntaxError`. Mais même si `json` est syntaxiquement correct, cela ne signifie pas que c'est un utilisateur valide, non? Il peut manquer les données nécessaires. Par exemple, il peut ne pas avoir les propriétés `name` et `age` qui sont essentielles pour nos utilisateurs.
21
+
En interne, nous utiliserons `JSON.parse`. S'il reçoit un `json` malformé, il renvoie`SyntaxError`. Mais même si `json` est syntaxiquement correct, cela ne signifie pas que c'est un utilisateur valide, non? Il peut manquer les données nécessaires. Par exemple, il peut ne pas avoir les propriétés `name` et `age` qui sont essentielles pour nos utilisateurs.
21
22
22
23
Notre fonction `readUser(json)` va non seulement lire JSON, mais aussi vérifier ("valider") les données. S'il n'y a pas de champs obligatoires ou si le format est incorrect, c'est une erreur. Et ce n’est pas une `SyntaxError`, car les données sont syntaxiquement correctes, mais un autre type d’erreur. Nous l'appellerons `ValidationError` et créerons une classe pour cela. Une erreur de ce type devrait également comporter des informations sur le champ fautif.
23
24
@@ -36,7 +37,7 @@ class Error {
36
37
}
37
38
```
38
39
39
-
Maintenant, héritons de `ValidationError` et mettons-le en action:
40
+
Maintenant, héritons de `ValidationError` et mettons-le en action:
40
41
41
42
```js run untrusted
42
43
*!*
@@ -57,15 +58,15 @@ try {
57
58
} catch(err) {
58
59
alert(err.message); // Whoops!
59
60
alert(err.name); // ValidationError
60
-
alert(err.stack); // une liste des appels imbriqués avec des numéros de ligne pour chaque
61
+
alert(err.stack); // une liste des appels imbriqués avec le numéro de ligne pour chacun d'entre eux
61
62
}
62
63
```
63
64
64
-
Remarque: à la ligne `(1)`, nous appelons le constructeur parent. JavaScript exige que nous appelions `super` dans le constructeur de l'enfant, donc c'est obligatoire. Le constructeur parent définit la propriété `message`.
65
+
Remarque: à la ligne `(1)`, nous appelons le constructeur parent. JavaScript exige que nous appelions `super` dans le constructeur de l'enfant, donc c'est obligatoire. Le constructeur parent définit la propriété `message`.
65
66
66
67
Le constructeur parent définit également la propriété `name` sur `"Error"`, donc à la ligne `(2)` nous la réinitialisons à la valeur correcte.
67
68
68
-
Essayons de l'utiliser dans `readUser(json)`:
69
+
Essayons de l'utiliser dans `readUser(json)`:
69
70
70
71
```js run
71
72
classValidationErrorextendsError {
@@ -101,7 +102,7 @@ try {
101
102
} elseif (err instanceofSyntaxError) { // (*)
102
103
alert("JSON Syntax Error: "+err.message);
103
104
} else {
104
-
throw err; // erreur inconnue, propager le (**)
105
+
throw err; // erreur inconnue, on la propage (**)
105
106
}
106
107
}
107
108
```
@@ -110,7 +111,7 @@ Le bloc `try..catch` dans le code ci-dessus gère à la fois notre `ValidationEr
110
111
111
112
Veuillez regarder comment nous utilisons `instanceof` pour vérifier le type d'erreur spécifique à la ligne `(*)`.
112
113
113
-
Nous pourrions aussi regarder `err.name`, comme ceci:
114
+
Nous pourrions aussi regarder `err.name`, comme ceci:
114
115
115
116
```js
116
117
// ...
@@ -119,9 +120,9 @@ Nous pourrions aussi regarder `err.name`, comme ceci:
119
120
// ...
120
121
```
121
122
122
-
La version `instanceof` est bien meilleure, car dans le futur nous allons étendre `ValidationError`, en créer des sous-types, comme `PropertyRequiredError`. Et `instanceof`check continuera à fonctionner pour les nouvelles classes héritées. Donc, c'est à l'épreuve du futur.
123
+
La version `instanceof` est bien meilleure, car dans le futur nous allons étendre `ValidationError`, en créer des sous-types, comme `PropertyRequiredError`. Et `instanceof` continuera à fonctionner pour les nouvelles classes héritées. Donc, c'est à l'épreuve du futur.
123
124
124
-
Il est également important que si `catch` rencontre une erreur inconnue, il la renvoie dans la ligne `(**)`. Le bloc `catch` ne sait que gérer les erreurs de validation et de syntaxe, d'autres types (causés par une faute de frappe dans le code ou d'autres raisons inconnues) devraient tomber.
125
+
Il est également important que si `catch` rencontre une erreur inconnue, il la renvoie à la ligne `(**)`. Le bloc `catch` ne sait gérer que les erreurs de validation et de syntaxe, les autres types (causés par une faute de frappe dans le code ou d'autres raisons inconnues) devraient êtres propagés.
125
126
126
127
## Héritage complémentaire
127
128
@@ -173,18 +174,18 @@ try {
173
174
} elseif (err instanceofSyntaxError) {
174
175
alert("JSON Syntax Error: "+err.message);
175
176
} else {
176
-
throw err; // erreur inconnue, propager le
177
+
throw err; // erreur inconnue, on la propage
177
178
}
178
179
}
179
180
```
180
181
181
-
La nouvelle classe `PropertyRequiredError` est facile à utiliser: il suffit de passer le nom de la propriété: `newPropertyRequiredError(property)`. Le `message` est généré par le constructeur.
182
+
La nouvelle classe `PropertyRequiredError` est facile à utiliser: il suffit de passer le nom de la propriété: `newPropertyRequiredError(property)`. Le `message` est généré par le constructeur.
182
183
183
-
Veuillez noter que `this.name` dans le constructeur `PropertyRequiredError` est à nouveau attribué manuellement. Cela peut devenir un peu fastidieux -- d'assigner `this.name=<classname>` dans chaque classe d'erreur personnalisée. Nous pouvons l'éviter en créant notre propre classe "d'erreur de base" qui assigne `this.name=this.constructor.name`. Et puis hériter de toutes nos erreurs personnalisées.
184
+
Veuillez noter que `this.name` dans le constructeur `PropertyRequiredError` est à nouveau attribué manuellement. Cela peut devenir un peu fastidieux -- d'assigner `this.name=<classname>` dans chaque classe d'erreur personnalisée. Nous pouvons l'éviter en créant notre propre classe "d'erreur de base" qui assigne `this.name=this.constructor.name`. Puis nous en ferons hériter toutes nos classes d'erreur personnalisées.
184
185
185
186
Appelons cela `MyError`.
186
187
187
-
Voici le code avec `MyError` et d'autres classes d'erreur personnalisées, simplifié:
188
+
Voici le code avec `MyError` et d'autres classes d'erreur personnalisées, simplifié:
188
189
189
190
```js run
190
191
classMyErrorextendsError {
@@ -205,7 +206,7 @@ class PropertyRequiredError extends ValidationError {
@@ -247,9 +248,9 @@ La technique que nous décrivons ici est appelée "encapsulation d'exceptions".
247
248
2. La fonction `readUser` interceptera les erreurs de lecture de données qui se produisent à l'intérieur, telles que `ValidationError` et `SyntaxError`, et générera à la place une `ReadError`.
248
249
3. L'objet `ReadError` conservera la référence à l'erreur d'origine dans sa propriété `cause`.
249
250
250
-
Ensuite, le code qui appelle `readUser` n'aura qu'à vérifier`ReadError`, pas pour tous les types d'erreurs de lecture de données. Et s'il a besoin de plus de détails sur une erreur, il peut vérifier sa propriété `cause`.
251
+
Ensuite, le code qui appelle `readUser` n'aura qu'à vérifier`ReadError`, pas pour tous les types d'erreurs de lecture de données. Et s'il a besoin de plus de détails sur une erreur, il peut vérifier sa propriété `cause`.
251
252
252
-
Voici le code qui définit `ReadError` et illustre son utilisation dans `readUser` et `try..catch`:
253
+
Voici le code qui définit `ReadError` et illustre son utilisation dans `readUser` et `try..catch`:
253
254
254
255
```js run
255
256
classReadErrorextendsError {
@@ -317,7 +318,7 @@ try {
317
318
}
318
319
```
319
320
320
-
Dans le code ci-dessus, `readUser` fonctionne exactement comme décrit ci-dessus - corrige les erreurs de syntaxe et de validation et "throw" les erreurs `ReadError` (les erreurs inconnues sont propagées comme d'habitude).
321
+
Dans le code ci-dessus, `readUser` fonctionne exactement comme décrit - il intercepte les erreurs de syntaxe et de validation et propage des erreurs `ReadError` (les erreurs inconnues sont propagées comme d'habitude).
321
322
322
323
Donc, le code externe vérifie `instanceof ReadError` et c'est tout. Pas besoin de lister tous les types d'erreur possibles.
0 commit comments