JavaScript中的异常处理

74 阅读2分钟

1. 异常的应用场景

  • 让一个函数告知外界自己内部出现了错误:可以通过throw关键字,抛出一个异常

  • throw语句:

    • throw语句用于抛出一个用户自定义的异常
    • 当遇到throw语句时,当前的函数执行会被停止(throw后面的语句不会执行
  • 如果执行代码会报错,拿到错误信息的时候就可以及时的去修正代码

    function sum(num1, num2) {
      if (typeof num1 !== "number") {
        throw "type error: num1传入的类型有问题, 必须是number类型"
      }
    
      if (typeof num2 !== "number") {
        throw "type error: num2传入的类型有问题, 必须是number类型"
      }
    
      return num1 + num2
    }
    
    // 李四调用
    const result = sum(123, 321)
    

2. throw抛出异常

  • throw 后面可以跟的类型

    • number/string/boolean
    • 自定义对象
    • new Error()
  • Error包含三个属性:

    • messsage:创建Error对象时传入的message;
    • name:Error的名称,通常和类的名称一致;
    • stack:整个Error的错误信息,包括函数的调用栈,当我们直接打印Error对象时,打印的就是stack;
  • Error有一些自己的子类:

    • RangeError:下标值越界时使用的错误类型;
    • SyntaxError:解析语法错误时使用的错误类型;
    • TypeError:出现类型错误时,使用的错误类型
    // throw抛出一个异常
    // 1.函数中的代码遇到throw之后, 后续的代码都不会执行
    // 2.throw抛出一个具体的错误信息
    function foo() {
      console.log("foo function1")
      // 1.number/string/boolean
      // throw "反正就是一个错误"
    
      // 2.抛出一个对象
      // throw { errMessage: "我是错误信息", errCode: -1001 }
    
      // 3.Error类: 错误函数的调用栈以及位置信息
      throw new Error("我是错误信息")
    
      console.log("foo function2")
      console.log("foo function3")
      console.log("foo function4")
    }
    

3. 捕获异常

  • 很多情况下当出现异常时,并不希望程序直接退出,而是希望可以正确的处理异常:这个时候就可以使用try...catch

  • 如果有一些必须要执行的代码,可以使用finally来执行:finally表示最终一定会被执行的代码结构

  • 注意:如果try和finally中都有返回值,那么会使用finally当中的返回值

    try {
    } catch(error) {
    } finally {
    }
    
    function foo() {
      console.log("foo function1")
      // throw new Error("我是错误信息")
      console.log("foo function2")
      console.log("foo function3")
      console.log("foo function4")
    }
    
    function test() {
      // 自己捕获了异常的话, 那么异常就不会传递给浏览器, 那么后续的代码可以正常执行
      try {
        foo()
        console.log("try后续的代码")
      } catch(error) {
        console.log("catch中的代码")
        // console.log(error)
      } finally {
        console.log("finally代码")
      }
    }
    
    function bar() {
      test()
    }
    
    bar()
    
    console.log("--------")