MDN的解释try…catchThe try…catch statement is comprised of a try block and either a catch block, a finally block, or both. The code in the try block is executed first, and if it throws an exception, the code in the catch block will be executed. The code in the finally block will always be executed before control flow exits the entire construct.

即:try语句包含了由一个或者多个语句组成的try块,和至少一个catch块或者一个finally块的其中一个,或者两个兼有,下面是三种形式的try声明:
  1. try…catch
  2. try…finally
  3. try…catch…finally

try…catch语法

  1. let a = 5;
  2. try{
  3. if(a === 5){
  4. throw "loopTerminates";
  5. }
  6. } catch (e) {
  7. console.log(e); //异常被捕获,控制台不报错 打印: loopTerminates
  8. }

运行流程:try{…}包含块中的代码有错误,则运行catch(err){…}内的代码,否则不运行catch(err){…}内的代码。

catch捕获异常

catch里的参数

  • error.name对应的六种错误类型
    • EvalError: eval()的使用与定义不一致
    • RangeError: 数值越界,数字值超出JavaScript可表示的范围
    • ReferenceError: 引用错误,要用的东西没找到(常见)
    • SyntaxError: 语法解析错误 (常见)
    • TypeError: 操作数类型错误
    • URLError: URL处理函数使用不当
  • error.message : 实际的错误信息
  • error.lineNumber: 错误的行数

catch不能捕获try中的异步

  1. async function time() {
  2. setTimeout(() => {
  3. console.log("延迟了 1 秒。");
  4. throw new Error('我是异步当中的报错');
  5. }, 1000);
  6. }
  7. async function main() {
  8. try{
  9. await time();
  10. throw new Error('我是try当中的报错');
  11. } catch (e) {
  12. console.log(e.message);
  13. }
  14. }
  15. main();

打印结果:先打印“我是try当中的报错”,1s后抛出“我是异步当中的报错”的报错,由此可见try…catch没有捕获到异步当中的异常,导致控制台报错。(注意:有异常一定要捕获,即try中尽量少的包含语句,避免异常没有捕获导致控制台报错)

异常处理try...catch - 图1

try…catch…finally

语法:

  1. try{
  2. // 在try里面发生错误,不会执行错误后面的try里面的代码。
  3. }catch(error){
  4. // 捕捉到的异常结果
  5. // error.name : 表示错误类型的字符串
  6. // error.message : 实际的错误信息
  7. // error.lineNumber: 错误的行数
  8. }finally{
  9. // 无论是否有异常发生都会执行。对关闭打开的链接和释放资源有用。
  10. }
下面的示例展示了 finally 代码块的一种使用情况。代码先打开一个文件,然后执行使用该文件的语句;即使出现异常,finally 块也会确保文件在使用后始终关闭。
  1. openMyFile();
  2. try {
  3. // tie up a resource
  4. writeMyFile(theData);
  5. } finally {
  6. closeMyFile(); // always close the resource
  7. }

也就是说如果 try 代码块抛出异常,即使没有 catch 代码块来处理异常,finally 代码块仍会执行,在这种情况下,异常仍会在 finally 代码块执行完毕后立即抛出。

finally块可以通过以下方式之一执行:

  • try 块正常执行结束后(没有抛出异常)立即执行;
  • catch 块正常执行完毕后立即执行;
  • 紧接着在 try 代码块或 catch 代码块中的控制流语句(return、throw、break、continue)执行之前执行。

throw error 与 throw new Error(error)的用法及区别

想学会try…catch就得先学会抛异常,因为抛出错误一般都是与try catch 同时出现的

  • throw error 是抛出错误
  1. var a = 5;
  2. try{
  3. if(a===5){
  4. // 抛出错误
  5. throw "loopTerminates";
  6. }
  7. } catch (e) {
  8. console.log(e); //打印: loopTerminates
  9. console.log(e.message); //打印:undefined
  10. }
  • throw new Error(error); 这个是创建错误,创造一个错误类型抛出
  1. var a = 5;
  2. try{
  3. if(a==5){
  4. // 抛出错误
  5. throw new Error("loopTerminates"); //Error要大写
  6. }
  7. }catch(e){
  8. console.log(e); //打印出Error对象:Error: loopTerminates
  9. console.log(e.message); //打印:loopTerminates(默认属性message)
  10. }

错误处理原则

  1. try中尽量少的包含语句
  2. 如果能提前预知错误的类型,就用if…else…来代替try…catch