梦入琼楼寒有月,行过石树冻无烟

Node.js error

对于错误的处理主要分为代码的错误和系统本身的问题其中包含内存不足或者打开文件过多、系统配置以及网络和远程服务问题,错误的处理需要加入到没有任何错误处理的程序中。

需要考虑到任何会导致失败所可能产生的结果,错误是一种 Error 的实例,从而抛出一个异常,或者通过 callback 进行无抛异常进而通过异常。

Error function

Id Name Info
1 throw 以同步的方式传递异常,如果调用者通过 try/catch 异常就会被捕获,如果异常未被捕获则会被 domains 或者进程级的 uncaughtExceptin 捕获
2 callback 是基础的异步传递方式,用户传进来一个函数(callback) 之后当某个异步操作完成后调用 callback ,在正常情况下 callback(err,result) 的形式被调用,这两个参数自然有一个是非空的,这取决与成功还是失败
3 EventEmitter 最为主要的是 EventEmitter 是没有 callback 而是返回 EventEmitter 对象。
error 当做一个可能会产生多个错误或多个结果的复杂操作时所返回的错误
row callback 所返回的 EventEmitter 的结果将会触发一个 row 事件
end 当 row 事件被触发的时候将会触发或返回一个 end 事件

通常 callback 和 EventEmitter 将会归到同一个异步的错误传递,使用 rhrow和callback 以及 EventEmitter 取决与 该一场是操作失败还是系统所造成的 BUG 以及 该函数是同步和异步的。

其中即可以同步传递错误并抛出,又可以传递错误(通过传给一个回调函数或者触发 EventEmitter 的 error 事件)。或者选择回调函数 try.catch 两种具体取决与异常的传递。

同步的异常捕获 (try/catch)

1
2
3
4
5
6
7
8
9
10
11
/*
捕获异常
Error: error!!
*/
try {
throw new Error('error!!')
} catch (e) {
console.log('捕获异常')
console.log(e)
}

process uncaughtException

假设 try/catch 未被捕获,则可以通过 process 所提供的 uncaughtException 事件来监听未捕获的异常:

1
2
3
4
5
6
7
8
9
10
11
try {
setTimeout(() => {
throw new Error('Error info')
})
} catch (e) {
console.error('error is:', e.message)
}

process.on('uncaughtException', (e) => {
console.log('process error is:', e.message)
})

events

1
2
3
4
5
6
7
8
9
10
11
12
13
14
const events = require('events')

/*
error is code
Error: Code is error
*/
const emitter = new events.EventEmitter()

emitter.addListener('error', (e) => {
console.log('error is code')
console.log(e)
})

emitter.emit('error', new Error(('Code is error')))

通过 events 库所提供的监听器来监听 error 的事件以及使用 emitter.emit 来发送错误并回调错误信息。

callback

1
2
3
4
5
6
7
8
9
10
11
12
const fs = require('fs')

/*
Error this process
*/
fs.mkdir('/dir',(e) => {
if (e) {
console.log("Error this process")
} else {
console.log('create dir')
}
})

Promise

promise 的操作返回 promise 其主要是在异步中操作完成后或失败所最终完成的结果值,他提供了两个值 resolve 以及 reject,reject 方法返回一个带有拒绝原因的 Promise 对象,而 resolve 则是返回一个指定值解析后的 promise 对象。

1
2
3
4
5
6
7
8
9
10
11
12
/*
This is error
Error: error
*/
new Promise((resolve, reject) => {
throw new Error('error')
}).then(() => {
// 逻辑处理
}).catch((e) => {
console.log('This is error')
console.log(e)
})

Async/Await

Async/Await 是基于 Promise 的更简洁的风格所编写,其中 async 韩式使用 async 关键字声明函数,从而避免了显式配置承诺链的作用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const func = function () {
return new Promise((resolve, reject) => {
throw new Error('error')
})
}

/*
This is error
Error: error
*/

async function funAsync() {
try {
await func()
} catch (e) {
console.log('This is error')
console.log(e)
}
}

funAsync()

domain

domain 模块可以处理多个不同 IO 的操作作为一个组,并注册到事件和回调到 domain,当发生一个错误事件或错误时,domain 对象将会被通知,从而不会丢失上下文环境,也不会导致程序立即退出。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
const doman = require('domain')
const d = doman.create()

d.on('error', (err) => {
console.log('err',err.message)
console.log(needSend.message)
})

const needSend = {message: 'To error data'}
d.add(needSend)

function excute() {
try {
setTimeout(() => {
throw new Error('Error info')
})
} catch (e) {
console.log('error is', e.message)
}
}

d.run(excute)
⬅️ Go back