一起来了解下try...catch...finally吧|8月更文挑战

468 阅读3分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

工欲善其事,必先利其器

先来了解下throw

  • throw 语句用来抛出一个用户自定义的异常
  • throw之后的语句将不会被执行
  • 并且控制将被传递到调用栈中的第一个catch块。
  • 如果调用者函数中没有catch块,程序将会终止。
function getRectArea(width, height) {
  if (isNaN(width) || isNaN(height)) {
    throw 'Parameter is not a number!';
  }
}

try {
  getRectArea(3, 'A');
} catch (e) {
  console.error(e);
}

throw 用法

  • throw 后面可以跟 基本类型的数据,表示要抛出的异常的内容。
throw "Error2"; // 抛出了一个值为字符串的异常
throw 42;       // 抛出了一个值为整数42的异常
throw true;     // 抛出了一个值为true的异常
  • 抛出一个对象
try {
    throw new Error('抛出的异常对象')
} catch (error){
    console.log(error, '此处变量error就是接收到的抛出的异常对象')
}

try catch 认知

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

    • try ... catch
    • try ... finally
    • try ... catch ... finally
  • catch 块中的代码意味着,try块中有任何一个语句(或者从try块中调用的函数)抛出异常,就会执行。 如果在try块中没有异常抛出,则会跳过catch块。

  • finally 在try块和catch块之后执行,但是会在下一个try声明之前执行。

  • 无论是否有异常抛出或捕获,finally总是会执行。

catch

  • catch块指定一个标识符,保存由throw语句指定的值。
  • catch块是唯一的,因为当输入catch块,js会创建此标识符,并将其添加到当前作用域。
  • 标识符仅在catch块执行时存在,catch块执行完成后,标识符不在可用。
  • 该标识符可以用来获取关于被抛出异常的信息。
try {
    throw new Error('出错啦')
} catch (error) {
    // 此处的error就是catch块的标识符
    console.log(error)
}
  • 任何给定的异常 只 会在离它最近的封闭catch块捕获一次

finally

  • 无论是否抛出异常,finally块总是会执行。
  • 当try catch块中有return语句时,finally中的代码依然会被执行。
  • 如果从finally块中返回一个值,那么这个值将会成为整个try-catch-finally的返回值,无论是否有return语句在try和catch块中。

关于异常捕获

  • try catch 无法捕捉异步的异常。
  • 准确的说是,能捕捉到的异常必须是线程执行已经进入try catch,但是 try catch并未执行完的时候。
  • 例如:语法报错,此时代码执行并未进入 try catch,那么无法捕获异常
try {
    a. 
} catch(err) {
    console.log('error', err)
}
// 将这段代码输入浏览器控制台。会得到下面的错误
// Uncaught SyntaxError: Unexpected token '}'

通俗的讲,你的代码都没写对,怎么能给你捕获到异常呢???