-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy patherror.js
More file actions
143 lines (114 loc) · 3.82 KB
/
error.js
File metadata and controls
143 lines (114 loc) · 3.82 KB
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
// class MyError extends Error {
// constructor(message) {
// super(message);
// this.name = this.constructor.name;
// }
// }
// class ValidationError extends Error { }
// class PropertyRequiredError extends ValidationError {
// constructor(property) {
// super("Нет свойства: " + property);
// this.property = property;
// }
// }
// // Использование
// function readUser(json) {
// let user = JSON.parse(json);
// if (!user.age) {
// throw new PropertyRequiredError("age");
// }
// if (!user.name) {
// throw new PropertyRequiredError("name");
// }
// return user;
// }
// // Рабочий пример с try..catch
// try {
// let user = readUser('{ "age": 25 }');
// } catch (err) {
// if (err instanceof ValidationError) {
// alert("Неверные данные: " + err.message); // Неверные данные: Нет свойства: name
// alert(err.name); // PropertyRequiredError
// alert(err.property); // name
// } else if (err instanceof SyntaxError) { // (*)
// alert("JSON Ошибка Синтаксиса: " + err.message);
// } else {
// throw err; // неизвестная ошибка, пробросить исключение (**)
// }
// }
class ReadError extends Error {
constructor(message, cause) {
super(message);
this.cause = cause;
this.name = 'ReadError';
}
}
class ValidationError extends Error { /*...*/ }
class PropertyRequiredError extends ValidationError { /* ... */ }
function validateUser(user) {
if (!user.age) {
throw new PropertyRequiredError("age");
}
if (!user.name) {
throw new PropertyRequiredError("name");
}
}
function readUser(json) {
let user;
try {
user = JSON.parse(json);
} catch (err) {
if (err instanceof SyntaxError) {
throw new ReadError("Синтаксическая ошибка", err);
} else {
throw err;
}
}
try {
validateUser(user);
} catch (err) {
if (err instanceof ValidationError) {
throw new ReadError("Ошибка валидации", err);
} else {
throw err;
}
}
}
try {
readUser('{bad json}');
} catch (e) {
if (e instanceof ReadError) {
alert(e);
// Исходная ошибка: SyntaxError:Unexpected token b in JSON at position 1
alert("Исходная ошибка: " + e.cause);
} else {
throw e;
}
}
class FormatError extends SyntaxError {
constructor(message) {
super(message);
this.name = 'FormatError';
}
}
window.addEventListener('unhandledrejection', function(event) {
// объект события имеет два специальных свойства:
alert(event.promise); // [object Promise] - промис, который сгенерировал ошибку
alert(event.reason); // Error: Ошибка! - объект ошибки, которая не была обработана
});
// the execution: catch -> catch -> then
new Promise((resolve, reject) => {
throw new Error("Ошибка!");
}).catch(function(error) { // (*)
if (error instanceof URIError) {
// обрабатываем ошибку
} else {
alert("Не могу обработать ошибку");
throw error; // пробрасывает эту или другую ошибку в следующий catch
}
}).then(function() {
/* не выполнится */
}).catch(error => { // (**)
alert(`Неизвестная ошибка: ${error}`);
// ничего не возвращаем => выполнение продолжается в нормальном режиме
});