Nodejs异步回调之异常处理实例
目前我们项目的Nodejs异常是通过express next 到 errorhandler 中间件去处理的, 原本以为此方法可以捕获到所有的异常,但事实发现并非如此。 下面以一个异常举例子:
req.get('',function(req, res, next){
var a = undefined.b; // 产生了一个exception
})
req.use(function(){req, res, next}{
next(); //最终到 errorhandler中间件中处理
})
上面这个例子中,我们人为的制造了一个excepteion,同时我们期望的结果是异常能进入到我们写好的handler中去做处理。 从上面代码的运行结果来看,也符合我们的预期。 如果换个地方抛出异常,结果就不是我们想要的了。
req.get('',function(req, res, next){
redis.get('key', function(){
var a = undefined.b; // 产生了一个exception
})//欢迎加入全栈开发交流圈一起学习交流:864305860
})
req.use(function(){req, res, next}{
next(); //最终到 errorhandler中间件中处理
})
上面的代码抛出的异常并不会被express捕获,也不会被next到我们的错误处理器中,而是会下面的代码捕获
process.on('uncaughtException', uncaughtExceptionHandler);
nodejs中,异步回调中的异常是无法被外围的try catch捕获的。
req.get('',function(req, res, next){
try{//欢迎加入全栈开发交流圈一起学习交流:864305860
redis.get('key', function(){
var a = undefined.b; // 产生了一个exception
})//欢迎加入全栈开发交流圈一起学习交流:864305860
}catch(e){
//并不会进到这里来
}
})
解决方案:
- Promise
function promiseFun() {
return new Promise(function (resolve, reject) {
redis.get('key', function(){
resolve("Hello");
// reject();
})//欢迎加入全栈开发交流圈一起学习交流:864305860
})//面向1-3年前端人员
}//帮助突破技术瓶颈,提升思维能力
promiseFun().then().catch();
- Async await
var getAsync1 = await async1();
async function async1() {
return new Promise(function (resolve, reject) {
redis.get('key', function(){
resolve("Hello");
// reject();
})
});
}//欢迎加入全栈开发交流圈一起学习交流:864305860
console.log(getAsync1);
But … 如果是下面这样写
function promiseFun() {
return new Promise(function (resolve, reject) {
redis.get('key', function(){
throw Error(); //依然捕获不到
})
})
}//欢迎加入全栈开发交流圈一起学习交流:864305860
promiseFun().then().catch();
结语
感谢您的观看,如有不足之处,欢迎批评指正。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
-
上一篇
你的 Ubuntu 为何如此炫酷?
很多人觉得 Windows 是最好的操作系统,它的用户图形化交互界面、它的各种功能应用,还有它的易用性等方面完全就碾压一切,Linux 党对此表示不屑;又有很多人把 elementary OS 定义为最美的 Linux 发行版,Ubuntu 党跳出来对此表示不屑。啊~并不是想(打)引(去)战(吧),其实笔者觉得不管是 Windows 还是 Linux,不管是 Ubuntu 还是其它 Linux 发行版,都有自己的特点,至于当下为什么更多的人使用 Windows 而不是 Linux,其中一个大原因在于易用性和相应的配套应用与个性化设置,然而其实他们误会了已经发展到如今的 Linux 了,或者说有些人根本没接触过吧。 Linux 发展到今天,早已不再是只局限于服务器与嵌入式端了,作为个人日常使用的操作系统也完全是杠杠的。鉴于笔者是 Ubuntu 流,本文就以目前比较活跃的 LTS Ubuntu 18.04 为例,从系统安装到具体配置,再到如何个性化美化,一步步分享一下个人经验,让大家了解到 Linux 也可以像 Windows 那样简易;而对于 Ubuntu 党外人士,只想告诉他们,Ubu...
-
下一篇
【SpringBoot系列】SpringBoot注解详解
一、注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让Spring Boot扫描到Configuration类并把它加入到程序上下文。 @Configuration 等同于spring的XML配置文件;使用java代码可以检查类型安全。 @EnableAutoConfiguration 自动配置。 @ComponentScan 组件扫描,可自动发现和装配一些Bean。 @Component可配合CommandLineRunner使用,在程序启动后执行一些基础任务。 @RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并且是将函数的返回值直 接填入HTTP响应体中,是REST风格的控制器。 @Autowired自动导入。 @PathVariable获取参数。 @JsonBackReference解决嵌套外链问题。 @RepositoryR...
相关文章
文章评论
共有0条评论来说两句吧...