在这里,我们检查函数参数是否为字符串 。如果不是,就抛出异常 。
从技术上讲,我们可以在 JavaScript 中抛出任何东西,而不仅仅是 Error 对象:
throw Symbol();throw 33;throw "Error!";throw null;
但是,最好避免这样做:要抛出正确的 Error 对象,而不是原语 。
4. 抛出异常时会发生什么?
异常一旦抛出,就会在程序堆栈中冒泡,除非在某个地方被捕获 。
来看下面的例子:
function toUppercase(string) {if (typeof string !== "string") {throw TypeError("Expected string");return string.toUpperCase();toUppercase(4);
在浏览器或 Node.js 中运行此代码,程序将停止并抛出错误:
文章插图
这里还显示了发生错误的确切行 。这个错误就是一个堆栈跟踪,有助于跟踪代码中的问题 。堆栈跟踪从下到上:
at toUppercase (:3:11)at :9:1toUppercase 函数在第 9 行调用,在第 3 行抛出错误 。除了在浏览器的控制台中查看此堆栈跟踪之外,还可以在 Error 对象的 stack 属性上访问它 。
介绍完这些关于错误的基础知识之后,下面来看看同步和异步 JavaScript 代码中的错误和异常处理 。
5. 同步错误处理(1)常规函数的错误处理
同步代码会按照代码编写顺序执行 。让我们再看看前面的例子:
function toUppercase(string) {if (typeof string !== "string") {throw TypeError("Expected string");return string.toUpperCase();toUppercase(4);在这里,引擎调用并执行 toUppercase,这一切都是同步发生的 。要捕获由此类同步函数引发的异常,可以使用 try/catch/finally:
try {toUppercase(4);} catch (error) {console.error(error.message);} finally {通常,try 会处理正常的路径,或者可能进行的函数调用 。catch 就会捕获实际的异常,它接收 Error 对象 。而不管函数的结果如何,finally 语句都会运行:无论它失败还是成功,finally 中的代码都会运行 。
(2)生成器函数的错误处理
JavaScript 中的生成器函数是一种特殊类型的函数 。它可以随意暂停和恢复,除了在其内部范围和消费者之间提供双向通信通道 。为了创建一个生成器函数,需要在 function 关键字后面加上一个 *:
function* generate() {只要进入函数,就可以使用 yield 来返回值:
function* generate() {yield 33;yield 99;生成器函数的返回值是一个迭代器对象 。要从生成器中提取值,可以使用两种方法:
- 在迭代器对象上调用 next()
- 使用 for...of 进行迭代
以上面的代码为例,要从生成器中获取值,可以这样做:
function* generate() {yield 33;yield 99;const go = generate();当我们调用生成器函数时,这里的 go 就是生成的迭代器对象 。接下来,就可以调用 go.next() 来继续执行:
function* generate() {yield 33;yield 99;const go = generate();const firstStep = go.next().value; // 33const secondStep = go.next().value; // 99生成器也可以接受来自调用者的值和异常 。除了 next(),从生成器返回的迭代器对象还有一个 throw() 方法 。使用这种方法,就可以通过向生成器中注入异常来停止程序:
function* generate() {yield 33;yield 99;const go = generate();const firstStep = go.next().value; // 33go.throw(Error("Tired of iterating!"));const secondStep = go.next().value; // never reached要捕获此类错误,可以使用 try/catch 将代码包装在生成器中:
function* generate() {try {yield 33;yield 99;} catch (error) {console.error(error.message);生成器函数也可以向外部抛出异常 。捕获这些异常的机制与捕获同步异常的机制相同:try/catch/finally 。
下面是使用 for...of 从外部使用的生成器函数的示例:
function* generate() {yield 33;yield 99;throw Error("Tired of iterating!");try {for (const value of generate()) {console.log(value);} catch (error) {console.error(error.message);输出结果如下:
文章插图
这里,try 块中包含正常的迭代 。如果发生任何异常,就会用 catch 捕获它 。
推荐阅读
- 血龙木是化学处理的木头吗 巴西龙血树的养殖方法
- 如何处理手机屏幕的划痕
- 废弃口罩的正确处理方式
- 如何处理人与自然界的关系
- 轻度发霉大米如何处理
- 戴尔笔记本开不了机怎么解决 戴尔电脑开不了机是什么原因?怎么处理
- 小乌龟溺水处理后应该怎么养 乌龟溺水了救活后该怎么调理
- 710a和710有什么区别?麒麟710a处理器很差吗?
- i7处理器的macbookpro 顶配的macbook pro
- 如何处理与老师之间的关系
