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