首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >异步函数中的异常处理及测试方法 [每日前端夜话(0x18)]

异步函数中的异常处理及测试方法 [每日前端夜话(0x18)]

作者头像
疯狂的技术宅
发布2019-03-27 11:29:40
2.9K0
发布2019-03-27 11:29:40
举报
文章被收录于专栏:京程一灯京程一灯

每日前端夜话0x18

每日前端夜话,陪你聊前端。

每天晚上18:00准时推送。

正文共:5152 字 17代码

预计阅读时间: 13 分钟

翻译:疯狂的技术宅 原文:https://www.valentinog.com/blog/throw-errors-async-functions-javascript/

可以在 Javascript 的异步函数中抛出错误吗?

这个话题已被反复提起过几百次,不过这次让我们从TDD的角度来回答它。

如果你能够不在Stackoverflow上搜索就能回答这个问题,会给我留下深刻的印象。

如果不能的话也可以变得很酷。 继续往下读,你就会学到!

你将学到什么

通过后面的内容你将学到:

  • 如何从 Javascript 的异步函数中抛出错误
  • 如何使用 Jest 测试来自异步函数的异常

要求

要继续往下读你应该:

  • 对 Javascript 和 ES6 有基本的了解
  • 安装 Node.Js 和 Jest

如何从 Javascript 的常规函数中抛出错误

使用异常而不是返回码(清洁代码)

抛出错误是处理未知的最佳方法。

同样的规则适用于各种现代语言:Java、Javascript、Python、Ruby。

你可以从函数中抛出错误,可以参照以下示例:

这是对它的测试(使用Jest):

也可以从 ES6 的类中抛出错误。在 Javascript 中编写类时,我总会在构造函数中输入意外值。下面是一个例子:

以下是该类的测试:

测试确实通过了:

安排的明明白白!

所以无论异常是从常规函数还是从类构造函数(或从方法)抛出的,一切都会按照预期工作。

但是如果我想从异步函数中抛出错误怎么办?

我可以在测试中使用assert.throws吗?

各位看官请上眼!

测试异常

所以你应该知道什么是 Javascript 的异步函数,对吗?先看一段代码:

假设你要添加异步方法来获取有关该人的数据。这种方法需要一个网址。如果url不是字符串,就要像上一个例子中那样抛出错误。

先来修改一下这个类:

如果我运行代码会怎么样?试试吧:

结果是这样

果然不出所料,异步方法返回了一个Promise rejection,从严格意义上来讲,并没有抛出什么东西。错误被包含在了Promise rejection中。

换句话说,我不能使用 assert.throws 来测试它。

让我们通过测试来验证一下:

测试失败了!

有没有悟出点什么?

看把你能的,来抓我啊

从严格意义上讲异步函数和异步方法不会抛出错误。异步函数和异步方法总是返回一个Promise,无论它已完成还是被拒绝,你必须附上 then() 和 catch(),无论如何。(或者将方法包装在try/catch中)。被拒绝的Promise将会在堆栈中传播,除非你抓住(catch)它

至于测试代码,应该这样写:

我们测试的不能是普通的异常,而是带有TypeError的rejects。

现在测试通过了:

那代码该怎么写呢?为了能够捕获错误,你应该这样重构:

现在异常将会出现在控制台中:

如果你想要更多的try/catch.,有一件重要的事需要注意。

下面的代码不会捕获错误:

记住:被拒绝的Promise会在堆栈中传播,除非你抓住(catch)它。

要在 try/catch 中正确捕获错误,可以像这样重构:

这就是它的工作原理。

总结

最后总结一下:

从异步函数抛出的错误不会是“普通的异常”

异步函数和异步方法总是返回一个Promise,无论是已解决还是被拒绝。

要拦截异步函数中的异常,必须使用catch()

以下是在Jest中测试异常的规则:

  • 使用 assert.throws 来测试普通函数和方法中的异常
  • 使用 expect + rejects 来测试异步函数和异步方法中的异常

如果你对如何使用 Jest 测试 Koa 2 感兴趣,请查看使用Jest和Supertest进行测试的简绍这篇文章。

感谢阅读!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 京程一灯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 你将学到什么
  • 要求
  • 如何从 Javascript 的常规函数中抛出错误
  • 测试异常
  • 看把你能的,来抓我啊
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档