156 lines
		
	
	
		
			2.7 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			156 lines
		
	
	
		
			2.7 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`到错误时,它实际上并没有被“ `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`块中嵌入`try-catch`语句。
 | 
						||
*   向上抛出错误。
 | 
						||
 | 
						||
```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) |