我已按照this question中找到的推荐解决方案,但我仍然看到错误导致我的观察者受损。
鉴于这样的观察者:
var through = require('through2');
var watch = require('gulp-watch');
gulp.task('catchall', function() {
return watch('gulpfile.js')
.pipe(through.obj(externalFunc))
.on('error', function(err) {
console.log('Inside error handler:', err);
});
});
将externalFunc定义为:
function externalFunc(file, enc, done) {
throw new Error("I have been compromised - Abort mission!");
}
我希望看到输出:
[10:52:51] Starting 'catchall'...
[10:52:53] gulpfile.js was changed
Inside error handler: I have been compromised - Abort mission!
相反,我没有得到externalFunc
的输出,而是获得标准错误输出和堆栈跟踪:
[10:52:51] Starting 'catchall'...
[10:52:53] gulpfile.js was changed
/my/path/to/gulpfile.js:27
throw new Error("I have been compromised - Abort mission!");
^
Error: I have been compromised - Abort mission!
at DestroyableTransform.externalFunc [as _transform] ....
最重要的是,观察者崩溃了。
为什么这个错误不会被on('error')
侦听器捕获,我可以在gulp观察器中做什么来处理这些错误而不退出?
答案 0 :(得分:1)
它没有陷入错误监听器,因为如你所说,这不是流错误。
您实际上向运行 gulp 的节点进程抛出错误,而不是捕获它,因此它的行为与uncaughtException
和完全崩溃所有内容,而不是等待你设置的错误处理程序。
只是为了演示,但不推荐,你可以这样做:
process.on('uncaughtException', function (er) {
console.error('Throwing error:', er);
});
将记录错误,您的gulp watch仍会运行。
我可能会建议您查看Node Domains以处理您的错误安全问题,但我不知道在某些事情中使用uncaughtException
是否真的是一种不好的做法像gulp。