# é误å¤çæºå¶
## Error å®ä¾å¯¹è±¡
JavaScript è§£ææè¿è¡æ¶ï¼ä¸æ¦åçé误ï¼å¼æå°±ä¼æåºä¸ä¸ªé误对象ãJavaScript åçæä¾`Error`æé 彿°ï¼æææåºçéè¯¯é½æ¯è¿ä¸ªæé 彿°çå®ä¾ã
```javascript
var err = new Error('åºéäº');
err.message // "åºéäº"
```
ä¸é¢ä»£ç ä¸ï¼æä»¬è°ç¨`Error`æé 彿°ï¼çæä¸ä¸ªå®ä¾å¯¹è±¡`err`ã`Error`æé 彿°æ¥åä¸ä¸ªåæ°ï¼è¡¨ç¤ºé误æç¤ºï¼å¯ä»¥ä»å®ä¾ç`message`屿§è¯»å°è¿ä¸ªåæ°ãæåº`Error`å®ä¾å¯¹è±¡ä»¥åï¼æ´ä¸ªç¨åºå°±ä¸æå¨åçé误çå°æ¹ï¼ä¸åå¾ä¸æ§è¡ã
JavaScript è¯è¨æ ååªæå°ï¼`Error`å®ä¾å¯¹è±¡å¿
é¡»æ`message`屿§ï¼è¡¨ç¤ºåºéæ¶çæç¤ºä¿¡æ¯ï¼æ²¡ææå°å
¶ä»å±æ§ã大夿° JavaScript 弿ï¼å¯¹`Error`å®ä¾è¿æä¾`name`å`stack`屿§ï¼åå«è¡¨ç¤ºé误çåç§°åé误çå æ ï¼ä½å®ä»¬æ¯éæ åçï¼ä¸æ¯æ¯ç§å®ç°é½æã
- **message**ï¼é误æç¤ºä¿¡æ¯
- **name**ï¼é误åç§°ï¼éæ å屿§ï¼
- **stack**ï¼é误çå æ ï¼éæ å屿§ï¼
使ç¨`name`å`message`è¿ä¸¤ä¸ªå±æ§ï¼å¯ä»¥å¯¹åçä»ä¹é误æä¸ä¸ªå¤§æ¦çäºè§£ã
```javascript
if (error.name) {
console.log(error.name + ': ' + error.message);
}
```
`stack`屿§ç¨æ¥æ¥çé误åçæ¶çå æ ã
```javascript
function throwit() {
throw new Error('');
}
function catchit() {
try {
throwit();
} catch(e) {
console.log(e.stack); // print stack trace
}
}
catchit()
// Error
// at throwit (~/examples/throwcatch.js:9:11)
// at catchit (~/examples/throwcatch.js:3:9)
// at repl:1:5
```
ä¸é¢ä»£ç ä¸ï¼éè¯¯å æ çæå
屿¯`throwit`彿°ï¼ç¶åæ¯`catchit`彿°ï¼æåæ¯å½æ°çè¿è¡ç¯å¢ã
## åçé误类å
`Error`å®ä¾å¯¹è±¡æ¯æä¸è¬çé误类åï¼å¨å®çåºç¡ä¸ï¼JavaScript è¿å®ä¹äºå
¶ä»6ç§é误对象ãä¹å°±æ¯è¯´ï¼åå¨`Error`ç6个派ç对象ã
### SyntaxError 对象
`SyntaxError`对象æ¯è§£æä»£ç æ¶åççè¯æ³é误ã
```javascript
// åéåé误
var 1a;
// Uncaught SyntaxError: Invalid or unexpected token
// ç¼ºå°æ¬å·
console.log 'hello');
// Uncaught SyntaxError: Unexpected string
```
ä¸é¢ä»£ç çé误ï¼é½æ¯å¨è¯æ³è§£æé¶æ®µå°±å¯ä»¥åç°ï¼æä»¥ä¼æåº`SyntaxError`ã第ä¸ä¸ªé误æç¤ºæ¯âtoken éæ³âï¼ç¬¬äºä¸ªé误æç¤ºæ¯âå符串ä¸ç¬¦åè¦æ±âã
### ReferenceError 对象
`ReferenceError`对象æ¯å¼ç¨ä¸ä¸ªä¸åå¨çåéæ¶åççé误ã
```javascript
// 使ç¨ä¸ä¸ªä¸åå¨çåé
unknownVariable
// Uncaught ReferenceError: unknownVariable is not defined
```
å¦ä¸ç§è§¦ååºæ¯æ¯ï¼å°ä¸ä¸ªå¼åé
ç»æ æ³åé
çå¯¹è±¡ï¼æ¯å¦å¯¹å½æ°çè¿è¡ç»ææè
`this`èµå¼ã
```javascript
// çå·å·¦ä¾§ä¸æ¯åé
console.log() = 1
// Uncaught ReferenceError: Invalid left-hand side in assignment
// this 对象ä¸è½æå¨èµå¼
this = 1
// ReferenceError: Invalid left-hand side in assignment
```
ä¸é¢ä»£ç 坹彿°`console.log`çè¿è¡ç»æå`this`èµå¼ï¼ç»æé½å¼åäº`ReferenceError`é误ã
### RangeError 对象
`RangeError`对象æ¯ä¸ä¸ªå¼è¶
åºææèå´æ¶åççé误ãä¸»è¦æå ç§æ
åµï¼ä¸æ¯æ°ç»é¿åº¦ä¸ºè´æ°ï¼äºæ¯`Number`å¯¹è±¡çæ¹æ³åæ°è¶
åºèå´ï¼ä»¥å彿°å æ è¶
è¿æå¤§å¼ã
```javascript
// æ°ç»é¿åº¦ä¸å¾ä¸ºè´æ°
new Array(-1)
// Uncaught RangeError: Invalid array length
```
### TypeError 对象
`TypeError`对象æ¯åéæåæ°ä¸æ¯é¢æç±»åæ¶åççéè¯¯ãæ¯å¦ï¼å¯¹å符串ãå¸å°å¼ãæ°å¼çåå§ç±»åçå¼ä½¿ç¨`new`å½ä»¤ï¼å°±ä¼æåºè¿ç§é误ï¼å 为`new`å½ä»¤çåæ°åºè¯¥æ¯ä¸ä¸ªæé 彿°ã
```javascript
new 123
// Uncaught TypeError: number is not a func
var obj = {};
obj.unknownMethod()
// Uncaught TypeError: obj.unknownMethod is not a function
```
ä¸é¢ä»£ç ç第äºç§æ
åµï¼è°ç¨å¯¹è±¡ä¸åå¨çæ¹æ³ï¼ä¹ä¼æåº`TypeError`é误ï¼å 为`obj.unknownMethod`ç弿¯`undefined`ï¼è䏿¯ä¸ä¸ªå½æ°ã
### URIError 对象
`URIError`å¯¹è±¡æ¯ URI ç¸å
³å½æ°ç忰䏿£ç¡®æ¶æåºçé误ï¼ä¸»è¦æ¶å`encodeURI()`ã`decodeURI()`ã`encodeURIComponent()`ã`decodeURIComponent()`ã`escape()`å`unescape()`è¿å
ä¸ªå½æ°ã
```javascript
decodeURI('%2')
// URIError: URI malformed
```
### EvalError 对象
`eval`彿°æ²¡æè¢«æ£ç¡®æ§è¡æ¶ï¼ä¼æåº`EvalError`é误ã该é误类åå·²ç»ä¸å使ç¨äºï¼åªæ¯ä¸ºäºä¿è¯ä¸ä»¥å代ç å
¼å®¹ï¼æç»§ç»ä¿çã
### æ»ç»
以ä¸è¿6ç§æ´¾çé误ï¼è¿ååå§ç`Error`对象ï¼é½æ¯æé 彿°ãå¼åè
å¯ä»¥ä½¿ç¨å®ä»¬ï¼æå¨çæé误对象çå®ä¾ãè¿äºæé 彿°é½æ¥åä¸ä¸ªåæ°ï¼ä»£è¡¨é误æç¤ºä¿¡æ¯ï¼messageï¼ã
```javascript
var err1 = new Error('åºéäºï¼');
var err2 = new RangeError('åºéäºï¼åéè¶
åºææèå´ï¼');
var err3 = new TypeError('åºéäºï¼åéç±»åæ æï¼');
err1.message // "åºéäºï¼"
err2.message // "åºéäºï¼åéè¶
åºææèå´ï¼"
err3.message // "åºéäºï¼åéç±»åæ æï¼"
```
## èªå®ä¹é误
é¤äº JavaScript åçæä¾çä¸ç§é误对象ï¼è¿å¯ä»¥å®ä¹èªå·±çé误对象ã
```javascript
function UserError(message) {
this.message = message || 'é»è®¤ä¿¡æ¯';
this.name = 'UserError';
}
UserError.prototype = new Error();
UserError.prototype.constructor = UserError;
```
ä¸é¢ä»£ç èªå®ä¹ä¸ä¸ªé误对象`UserError`ï¼è®©å®ç»§æ¿`Error`对象ãç¶åï¼å°±å¯ä»¥çæè¿ç§èªå®ä¹ç±»åçé误äºã
```javascript
new UserError('è¿æ¯èªå®ä¹çé误ï¼');
```
## throw è¯å¥
`throw`è¯å¥çä½ç¨æ¯æå¨ä¸æç¨åºæ§è¡ï¼æåºä¸ä¸ªé误ã
```javascript
if (x <= 0) {
throw new Error('x å¿
é¡»ä¸ºæ£æ°');
}
// Uncaught ReferenceError: x is not defined
```
ä¸é¢ä»£ç ä¸ï¼å¦æåé`x`å°äºçäº`0`ï¼å°±æå¨æåºä¸ä¸ªé误ï¼åè¯ç¨æ·`x`çå¼ä¸æ£ç¡®ï¼æ´ä¸ªç¨åºå°±ä¼å¨è¿é䏿æ§è¡ãå¯ä»¥çå°ï¼`throw`æåºçé误就æ¯å®çåæ°ï¼è¿éæ¯ä¸ä¸ª`Error`å®ä¾ã
`throw`ä¹å¯ä»¥æåºèªå®ä¹é误ã
```javascript
function UserError(message) {
this.message = message || 'é»è®¤ä¿¡æ¯';
this.name = 'UserError';
}
throw new UserError('åºéäºï¼');
// Uncaught UserError {message: "åºéäºï¼", name: "UserError"}
```
ä¸é¢ä»£ç ä¸ï¼`throw`æåºçæ¯ä¸ä¸ª`UserError`å®ä¾ã
å®é
ä¸ï¼`throw`å¯ä»¥æåºä»»ä½ç±»åçå¼ãä¹å°±æ¯è¯´ï¼å®çåæ°å¯ä»¥æ¯ä»»ä½å¼ã
```javascript
// æåºä¸ä¸ªå符串
throw 'Errorï¼';
// Uncaught Errorï¼
// æåºä¸ä¸ªæ°å¼
throw 42;
// Uncaught 42
// æåºä¸ä¸ªå¸å°å¼
throw true;
// Uncaught true
// æåºä¸ä¸ªå¯¹è±¡
throw {
toString: function () {
return 'Error!';
}
};
// Uncaught {toString: Æ}
```
å¯¹äº JavaScript 弿æ¥è¯´ï¼éå°`throw`è¯å¥ï¼ç¨åºå°±ä¸æ¢äºã弿伿¥æ¶å°`throw`æåºçä¿¡æ¯ï¼å¯è½æ¯ä¸ä¸ªé误å®ä¾ï¼ä¹å¯è½æ¯å
¶ä»ç±»åçå¼ã
## try...catch ç»æ
䏿¦åçé误ï¼ç¨åºå°±ä¸æ¢æ§è¡äºãJavaScript æä¾äº`try...catch`ç»æï¼å
许对é误è¿è¡å¤çï¼éæ©æ¯å¦å¾ä¸æ§è¡ã
```javascript
try {
throw new Error('åºéäº!');
} catch (e) {
console.log(e.name + ": " + e.message);
console.log(e.stack);
}
// Error: åºéäº!
// at