防止非流量错误破坏gulp watch

时间:2014-12-03 15:59:19

标签: javascript gulp

我已按照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观察器中做什么来处理这些错误而不退出?

1 个答案:

答案 0 :(得分:1)

它没有陷入错误监听器,因为如你所说,这不是流错误。

您实际上向运行 gulp 节点进程抛出错误,而不是捕获它,因此它的行为与uncaughtException和完全崩溃所有内容,而不是等待你设置的错误处理程序。

只是为了演示,但不推荐,你可以这样做:

process.on('uncaughtException', function (er) {
  console.error('Throwing error:', er);
});

将记录错误,您的gulp watch仍会运行。

我可能会建议您查看Node Domains以处理您的错误安全问题,但我不知道在某些事情中使用uncaughtException是否真的是一种不好的做法像gulp。