防止非流错误破坏吞噬手表
Prevent non-stream errors from breaking gulp watch
我已经遵循了这个问题中推荐的解决方案,但我仍然看到打断我的观察者的错误。
给定这样的观察者:
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
是否真的是一种不好的做法。
相关文章:
- 约曼:LiveReload对约曼手表
- 转换成ES 5使用babel通过吞咽手表不工作
- 控制器中有手表时出现角度UT问题
- Grunt手表在纠错后运行不减少
- 吞噬任务多个和共享的 scss 文件
- Vue.js:手表数组长度
- 角度指示手表高度
- $scope$Angular中的手表;我不在爱奥尼亚/科尔多瓦工作
- 指示中的角度手表元素高度
- 吞噬脚本和监视任务
- 吞噬中的命名空间
- 在指令中从 attr 的角度保存手表表达式
- 检测智能手表何时访问网页
- AngularJS - 分页不渲染$scope.手表更换(包括代码笔)
- 指令中的指令-手表不工作
- 手表和sass的不同咕哝任务
- 范围$手表项目doens'不适用于javascript对象的字段
- 加载易趣手表和询问按钮
- 为什么范围$手表坏了
- 防止非流错误破坏吞噬手表