异常处理

# try/catch 之痛
一般情况下,我们会将有可能出错的代码放到try/catch块里。但到了node.js,由于try/catch无法捕捉异步回调里的异常,node.js原生提供uncaughtException事件挂到process对象上,用于捕获所有未处理的异常:
process.on('uncaughtException', function(err) {
console.error('Error caught in uncaughtException event:', err);
});
try {
process.nextTick(function() {
fs.readFile('non_existent.js', function(err, str) {
if(err) throw err;
else console.log(str);
});
});
} catch(e) {
console.error('Error caught by catch block:', e);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
执行的结果是代码进到了 uncaughtException 的回调里而不是 catch 块。 uncaughtException 虽然能够捕获异常,但是此时错误的上下文已经丢失,即使看到错误也不知道哪儿报的错,定位问题非常的不利。而且一旦 uncaughtException 事件触发,整个 node 进程将 crash 掉,如果不做一些善后处理的话会导致整个服务挂掉,这对于线上的服务来说将是非常不好的。
# 使用 domain 模块捕捉异常
随着nodejs v0.8 版本发布了一个domain (域)模块,专门用于处理异步回调的异常。
process.on('uncaughtException', function(err) {
console.error('Error caught in uncaughtException event:', err);
});
var d = domain.create();
d.on('error', function(err) {
console.error('Error caught by domain:', err);
});
d.run(function() {
process.nextTick(function() {
fs.readFile('non_existent.js', function(err, str) {
if(err) throw err;
else console.log(str);
});
});
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
上次更新: 2022/08/31, 09:41:27