防止非流错误破坏吞噬手表

Prevent non-stream errors from breaking gulp watch

本文关键字:吞噬 手表 错误      更新时间:2023-09-26

我已经遵循了这个问题中推荐的解决方案,但我仍然看到打断我的观察者的错误。

给定这样的观察者:

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);
    });
});

外部 Func 定义为:

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 观察器中执行哪些操作来处理这些错误而不退出?

它不会被困在错误侦听器中,因为正如您所说,这不是流错误。

您实际上是在向运行 gulp节点进程抛出一个错误,并且没有捕获它,因此它的行为就像一个uncaughtException并完全崩溃所有内容,而无需等待您设置的错误处理程序来完成它的工作。

仅用于演示,但不推荐,您可以执行以下操作:

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

错误将被记录,您的 gulp 手表仍将运行。

我可能会建议您查看节点域来处理您的错误安全,尽管我不知道在 gulp 之类的东西中使用 uncaughtException 是否真的是一种不好的做法。