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) |