资讯专栏INFORMATION COLUMN

Nodejs异常处理

Youngs / 903人阅读

摘要:中常用的异常处理方式每秒钟打印一次时间,确保程序没有奔溃模拟同步代码块内出现异常模拟异步代码块内出现异常方式处理异常异常被捕获了,我可以继续执行但是方式无法处理异步代码块内出现的异常,你可以理解为执行时,异常还没有发生。

为什么要处理异常?
1.不处理直接导致程序奔溃,这显然不是我们想要的

2.导致请求无法被释放,直至连接超时。用户体验体验非常差,我们要做的应该是在出错时,给用户一个友好的提示,并记录下此次异常,以便排查。
Node.js中常用的异常处理方式
// 每秒钟打印一次时间,确保程序没有奔溃
(function loop() {
    console.log(new Date().getTime())
    setTimeout(function () {
        loop() 
    }, 1000)
})()
// 模拟同步代码块内出现异常
let syncError = () => {
    throw new Error("Sync Error")
}
// 模拟异步代码块内出现异常
let asyncError = () => {
    setTimeout(function () {
        throw new Error("Async Error")
    }, 100)
}
1、try catch 方式
try {
    syncError()
} catch (e) {
    /*处理异常*/
    console.log(e.message)
}
console.log("异常被捕获了,我可以继续执行")

但是try catch方式无法处理异步代码块内出现的异常,你可以理解为执行catch时,异常还没有发生。

try {
    asyncError()
} catch (e) {
    /*异常无法被捕获,导致进程退出*/
    console.log(e.message)
}

2、callback方式
fs.mkdir("/dir", function (e) {
    if (e) {
        /*处理异常*/
        console.log(e.message)
    } else {
        console.log("创建目录成功")
    }
})
3、event 方式
let events = require("events");
//创建一个事件监听对象
let emitter = new events.EventEmitter();
//监听error事件
emitter.addListener("error", function (e) {
    /*处理异常*/
    console.log(e.message)
});
//触发error事件
emitter.emit("error", new Error("出错啦"));
4、Promise 方式
new Promise((resolve, reject) => {
    syncError()
    /* or
    try{
        syncError()
    }catch(e){
        reject(e)
    }
    */
})
    .then(() => {
        //...
    })
    .catch((e) => {
        /*处理异常*/
        console.log(e.message)
    })

Promise同样无法处理异步代码块中抛出的异常

new Promise((resolve, reject) => {
    asyncError()
})
    .then(() => {
        //...
    })
    .catch((e) => {
        /*异常无法被捕获,导致进程退出*/
        console.log(e.message)
    })

5、Async/Await 方式

Async/Await是基于Promise的,所以Promise无法捕获的异常,Async/Await同样无法捕获

var sleep = function (time) {
    return new Promise(function (resolve, reject) {
        syncError()
    })
};

(async function () {
    try {
        await sleep(100);
    } catch (e) {
        /*处理异常*/
        console.log(e.message)
    }
})()
6、process方式

process方式可以捕获任何异常(不管是同步代码块中的异常还是异步代码块中的异常)

process.on("uncaughtException", function (e) {
    /*处理异常*/
    console.log(e.message)
});
asyncError()
syncError()
7、domain方式

process方式虽然可以捕获任何类型的异常,但是process太过笨重,除了记录下错误信息,其他地方不适合使用,domain这个也可以处理任何类型异常的模块,显然是一个不错的选择。

let domain = require("domain")
let d = domain.create()
d.on("error", function (e) {
    /*处理异常*/
    console.log(e.message)
})
d.run(asyncError)
d.run(syncError)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/83330.html

相关文章

  • 在非阻塞IO下的nodejs下的同步并行 ES6的 promise 从入门深入(一)

    摘要:我们先介绍一下中的的一些调用再结合的应用逐步深入。这就是一些简单的的调用看起来不多,但是靠这个真得解决了许多必须同步并行的环境本身是一个对象在开始支持。存在两个回调函数根据个人的需求进行处理。 什么是promise?为什么要在nodejs中使用promise?使用promise到底有什么好处呢?实在太多了,一一说来不如直接上实战。我们先介绍一下nodejs中的promise的一些调用....

    luffyZh 评论0 收藏0
  • 玩转Koa -- 核心原理分析

    摘要:三中间件实现原理首先需要明确是中间件并不是中的概念,它只是和框架衍生的概念。中间件的执行流程主要由与函数决定依次取出中间件终止条件路由匹配规则函数中使用闭包函数来检测是否与当前路由相匹配,匹配则执行该上的中间件函数,否则继续检查下一个。 Koa作为下一代Web开发框架,不仅让我们体验到了async/await语法带来同步方式书写异步代码的酸爽,而且本身简洁的特点,更加利于开发者结合业务...

    jsbintask 评论0 收藏0
  • nodejs之process进程小记

    摘要:因为进程退出之后将不再执行事件循环,所有只有那些没有回调函数的代码才会被执行。此外,创建的回调函数具有隔离性,他们之间不会相互影响。我们来看的一个简单例子,他创建了一个子进程,第一个参数是一个命令,第二个参数是回调函数,处理返回结果。 虽然node对操作系统做了很多抽象的工作,但是你还是可以直接和他交互,比如和系统中已经存在的进程进行交互,创建工作子进程。node是一个用于事件循环的线...

    Binguner 评论0 收藏0
  • Nodejs进阶:核心模块net入门与实例讲解

    摘要:模块概览模块是同样是的核心模块。在模块概览里提到,继承了,此外,客户端与服务端的通信均依赖于。正常关闭的同时,会被执行,同时会触发事件。事实上,中的在内部实现中也是加入了做为事件的监听函数。默认情况下,会完成自我销毁操作。 本文摘录自《Nodejs学习笔记》,更多章节及更新,请访问 github主页地址。欢迎加群交流,群号 197339705。 模块概览 net模块是同样是nodejs...

    LdhAndroid 评论0 收藏0
  • Node.js基础 23456:全局对象,回调函数,模块,事件,读写文件(同步,异步)

    摘要:它们的作用域只在模块内,详见文档回调函数与一样,如模块一个大项目一定是分成一个个模块的,一般来说,一个文件就是一个模块。这些对象有一个函数,用于将一个或多个函数绑定到命名事件上。用于注册监听器,用于触发事件。 全局对象 类似的,在浏览器中有window全局变量在所有模块中都可使用。不需要引用等。全局变量如console,setTimeout,require()等 全局变量在所有模块中都...

    RobinTang 评论0 收藏0

发表评论

0条评论

Youngs

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<