152 lines
2.6 KiB
Markdown
152 lines
2.6 KiB
Markdown
|
---
|
||
|
title: Error Handling and Try Catch Throw
|
||
|
---
|
||
|
## Error Handling and Try Catch Throw
|
||
|
|
||
|
The `try...catch..finally` statement marks a block of statements to try, and specifies a response, should an exception be thrown. The `try` statement contains one or more statements, and at least one `catch` clause or a `finally` clause, or both.
|
||
|
|
||
|
|
||
|
#### `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
|
||
|
```
|
||
|
*Note:* when you don't `catch` the error, it is in fact not 'catched', even though the `finally` block is executed. That means that the error will continue to the upper `try` block (or main block).
|
||
|
|
||
|
#### `try...catch...finally`:
|
||
|
```javascript
|
||
|
try {
|
||
|
throw new Error('my error');
|
||
|
}
|
||
|
catch (e) {
|
||
|
console.error(e.message);
|
||
|
}
|
||
|
finally {
|
||
|
console.error('finally');
|
||
|
}
|
||
|
|
||
|
// Output:
|
||
|
// my error
|
||
|
// finally
|
||
|
```
|
||
|
|
||
|
Typical usage:
|
||
|
```javascript
|
||
|
try {
|
||
|
openFile(file);
|
||
|
readFile(file)
|
||
|
}
|
||
|
catch (e) {
|
||
|
console.error(e.message);
|
||
|
}
|
||
|
finally {
|
||
|
closeFile(file);
|
||
|
}
|
||
|
```
|
||
|
|
||
|
#### Nested `try...catch`:
|
||
|
You can also:
|
||
|
- Nest a `try-catch` statement inside a `try` block.
|
||
|
- Throw the error upwards.
|
||
|
```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
|
||
|
```
|
||
|
#### Types of Error
|
||
|
|
||
|
##### Reference 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
|
||
|
|
||
|
```
|
||
|
|
||
|
##### Syntax Error
|
||
|
|
||
|
```javascript
|
||
|
try {
|
||
|
eval("alert('Hello)"); // Missing ' will produce an error
|
||
|
}
|
||
|
catch(err) {
|
||
|
console.log(err.name,err.message);
|
||
|
}
|
||
|
// SyntaxError Invalid or unexpected token
|
||
|
```
|
||
|
|
||
|
##### Type Error
|
||
|
|
||
|
```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 Error
|
||
|
|
||
|
```javascript
|
||
|
try {
|
||
|
decodeURI("%%%"); // You cannot URI decode these percent signs
|
||
|
}
|
||
|
catch(err) {
|
||
|
console.log(err.name, err.message);
|
||
|
}
|
||
|
// URIError URI malformed
|
||
|
```
|
||
|
|
||
|
|
||
|
#### More Information:
|
||
|
|
||
|
<a href='https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch' target='_blank' rel='nofollow'>MDN</a>
|
||
|
<a href='https://www.w3schools.com/js/js_errors.asp' target='_blank' rel='nofollow'>W3S</a>
|