Skip to content

Commit 55c8e13

Browse files
Apply minor fixes in '1-js/10-error-handling/2-custom-errors/article.md'
1 parent 516157f commit 55c8e13

File tree

1 file changed

+21
-20
lines changed

1 file changed

+21
-20
lines changed

1-js/10-error-handling/2-custom-errors/article.md

Lines changed: 21 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# Les erreurs personnalisées, Étendre Error
1+
# Les erreurs personnalisées, extension de Error
22

33
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.
44

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`.
66

77
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.
88

@@ -12,12 +12,13 @@ Au fur et à mesure que l'application grandit, nos propres erreurs forment natur
1212

1313
A titre d'exemple, considérons une fonction `readUser(json)` qui devrait lire JSON avec des données utilisateur.
1414

15-
Voici un exemple de l'apparence d'un `json` valide:
15+
Voici un exemple de l'apparence d'un `json` valide :
16+
1617
```js
1718
let json = `{ "name": "John", "age": 30 }`;
1819
```
1920

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.
2122

2223
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.
2324

@@ -36,7 +37,7 @@ class Error {
3637
}
3738
```
3839

39-
Maintenant, héritons de `ValidationError` et mettons-le en action:
40+
Maintenant, héritons de `ValidationError` et mettons-le en action :
4041

4142
```js run untrusted
4243
*!*
@@ -57,15 +58,15 @@ try {
5758
} catch(err) {
5859
alert(err.message); // Whoops!
5960
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
6162
}
6263
```
6364

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`.
6566

6667
Le constructeur parent définit également la propriété `name` sur `"Error"`, donc à la ligne `(2)` nous la réinitialisons à la valeur correcte.
6768

68-
Essayons de l'utiliser dans `readUser(json)`:
69+
Essayons de l'utiliser dans `readUser(json)` :
6970

7071
```js run
7172
class ValidationError extends Error {
@@ -101,7 +102,7 @@ try {
101102
} else if (err instanceof SyntaxError) { // (*)
102103
alert("JSON Syntax Error: " + err.message);
103104
} else {
104-
throw err; // erreur inconnue, propager le (**)
105+
throw err; // erreur inconnue, on la propage (**)
105106
}
106107
}
107108
```
@@ -110,7 +111,7 @@ Le bloc `try..catch` dans le code ci-dessus gère à la fois notre `ValidationEr
110111

111112
Veuillez regarder comment nous utilisons `instanceof` pour vérifier le type d'erreur spécifique à la ligne `(*)`.
112113

113-
Nous pourrions aussi regarder `err.name`, comme ceci:
114+
Nous pourrions aussi regarder `err.name`, comme ceci :
114115

115116
```js
116117
// ...
@@ -119,9 +120,9 @@ Nous pourrions aussi regarder `err.name`, comme ceci:
119120
// ...
120121
```
121122
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.
123124
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.
125126
126127
## Héritage complémentaire
127128
@@ -173,18 +174,18 @@ try {
173174
} else if (err instanceof SyntaxError) {
174175
alert("JSON Syntax Error: " + err.message);
175176
} else {
176-
throw err; // erreur inconnue, propager le
177+
throw err; // erreur inconnue, on la propage
177178
}
178179
}
179180
```
180181
181-
La nouvelle classe `PropertyRequiredError` est facile à utiliser: il suffit de passer le nom de la propriété: `new PropertyRequiredError(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é : `new PropertyRequiredError(property)`. Le `message` est généré par le constructeur.
182183
183-
Veuillez noter que `this.name` dans le constructeur `PropertyRequiredError` est à nouveau attribué manuellement. Cela peut devenir un peu fastidieux -- d'assigner `this.name = <class name>` 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 = <class name>` 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.
184185
185186
Appelons cela `MyError`.
186187
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é :
188189
189190
```js run
190191
class MyError extends Error {
@@ -205,7 +206,7 @@ class PropertyRequiredError extends ValidationError {
205206
}
206207
}
207208

208-
// name is correct
209+
// le nom est correcte
209210
alert( new PropertyRequiredError("field").name ); // PropertyRequiredError
210211
```
211212
@@ -247,9 +248,9 @@ La technique que nous décrivons ici est appelée "encapsulation d'exceptions".
247248
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`.
248249
3. L'objet `ReadError` conservera la référence à l'erreur d'origine dans sa propriété `cause`.
249250
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`.
251252
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` :
253254
254255
```js run
255256
class ReadError extends Error {
@@ -317,7 +318,7 @@ try {
317318
}
318319
```
319320
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).
321322
322323
Donc, le code externe vérifie `instanceof ReadError` et c'est tout. Pas besoin de lister tous les types d'erreur possibles.
323324

0 commit comments

Comments
 (0)