156 lines
3.4 KiB
Markdown
156 lines
3.4 KiB
Markdown
---
|
||
title: Error Handling and Try Catch Throw
|
||
localeTitle: Обработка ошибок и попытка бросить вызов
|
||
---
|
||
## Обработка ошибок и попытка бросить вызов
|
||
|
||
`try...catch..finally` оператор маркирует блок операторов, чтобы попробовать, и указывает ответ, если должно быть выбрано исключение. Оператор `try` содержит одно или несколько операторов и по крайней мере одно предложение `catch` или предложение `finally` или оба.
|
||
|
||
#### `try...catch` :
|
||
|
||
```javascript
|
||
try {
|
||
throw new Error('my error');
|
||
}
|
||
catch (e) {
|
||
console.error(e.message);
|
||
}
|
||
|
||
// Output:
|
||
// my error
|
||
```
|
||
|
||
#### `try...finally` :
|
||
|
||
```javascript
|
||
try {
|
||
throw new Error('my error');
|
||
}
|
||
finally {
|
||
console.error('finally');
|
||
}
|
||
|
||
// Output:
|
||
// finally
|
||
```
|
||
|
||
_Примечание:_ когда вы не `catch` ошибку, она фактически не «поймана», даже если блок `finally` выполнен. Это означает, что ошибка будет продолжаться до верхнего блока `try` (или основного блока).
|
||
|
||
#### `try...catch...finally` :
|
||
|
||
```javascript
|
||
try {
|
||
throw new Error('my error');
|
||
}
|
||
catch (e) {
|
||
console.error(e.message);
|
||
}
|
||
finally {
|
||
console.error('finally');
|
||
}
|
||
|
||
// Output:
|
||
// my error
|
||
// finally
|
||
```
|
||
|
||
Типичное использование:
|
||
|
||
```javascript
|
||
try {
|
||
openFile(file);
|
||
readFile(file)
|
||
}
|
||
catch (e) {
|
||
console.error(e.message);
|
||
}
|
||
finally {
|
||
closeFile(file);
|
||
}
|
||
```
|
||
|
||
#### Вложенная `try...catch` :
|
||
|
||
Вы также можете:
|
||
|
||
* Зафиксируйте оператор `try-catch` внутри блока `try` .
|
||
* Выбросьте ошибку вверх.
|
||
|
||
```javascript
|
||
try {
|
||
try {
|
||
throw new Error('my error');
|
||
}
|
||
catch (e) {
|
||
console.error('inner', e.message);
|
||
throw e;
|
||
}
|
||
finally {
|
||
console.log('finally');
|
||
}
|
||
}
|
||
catch (e) {
|
||
console.error('outer', e.message);
|
||
}
|
||
|
||
// Output:
|
||
// inner my error
|
||
// finally
|
||
// outer my error
|
||
```
|
||
|
||
#### Типы ошибок
|
||
|
||
##### Исходная ошибка
|
||
|
||
```javascript
|
||
var x;
|
||
try {
|
||
x = y + 1; // y cannot be referenced (used)
|
||
}
|
||
catch(err) {
|
||
console.log(err.name, err.message);
|
||
}
|
||
// ReferenceError y is not defined
|
||
```
|
||
|
||
##### Ошибка синтаксиса
|
||
|
||
```javascript
|
||
try {
|
||
eval("alert('Hello)"); // Missing ' will produce an error
|
||
}
|
||
catch(err) {
|
||
console.log(err.name,err.message);
|
||
}
|
||
// SyntaxError Invalid or unexpected token
|
||
```
|
||
|
||
##### Ошибка типа
|
||
|
||
```javascript
|
||
var num = 1;
|
||
try {
|
||
num.toUpperCase(); // You cannot convert a number to upper case
|
||
}
|
||
catch(err) {
|
||
console.log(err.name, err.message);
|
||
}
|
||
// TypeError num.toUpperCase is not a function
|
||
```
|
||
|
||
##### Ошибка URI
|
||
|
||
```javascript
|
||
try {
|
||
decodeURI("%%%"); // You cannot URI decode these percent signs
|
||
}
|
||
catch(err) {
|
||
console.log(err.name, err.message);
|
||
}
|
||
// URIError URI malformed
|
||
```
|
||
|
||
#### Дополнительная информация:
|
||
|
||
[MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try…catch) [W3S](https://www.w3schools.com/js/js_errors.asp) |