如果抛出异常,为什么 GruntJS 不中断执行?

Why doesn't GruntJS break execution if exception is thrown?

我正在探索 grunt-inline 模块并遇到以下问题。我有以下任务的配置:

grunt.initConfig({
  inline: {
    options: {
       uglify: true
    },
    dist: {
      src: 'src/index.html',
      dest: 'dist/index.html'
    }
  }
});

从上面的配置中 uglify: true 选项意味着在 this line:

上执行 UglifyJS.minify
var c = options.uglify ? UglifyJS.minify(inlineFilePath).code : grunt.file.read( inlineFilePath );

问题是,如果 UglifyJS.minify 抛出异常(我刚刚遇到),grunt inline 命令不会失败,但会完全退出。

所以,这个模块的问题是我这边缺少一些 grunt 的标志吗?

如果你能向我解释如何在任何异常情况下中断 grunt 执行,那就太好了。

编辑: 我还注意到,如果我捕获异常并自己重新抛出它,它会很好地破坏 grunt,如下所示:

try {
    var c = options.uglify ? UglifyJS.minify(inlineFilePath).code : grunt.file.read( inlineFilePath );
} catch(e) {
    throw new Error(e.message);
}

那么为什么 UglifyJS.minify(inlineFilePath).code 的异常不会中断 gruntjs 任务?

模块似乎有问题。我似乎找不到标记和 return 这些错误的方法。您可以尝试将该行替换为:

var c;
if(options.uglify){
    try{
        c = UglifyJS.minify(inlineFilePath).code
    }catch(err){
        grunt.log.error(err);//catch error and send to grunt
    }
}else{
        c=grunt.file.read( inlineFilePath );
}

更新: 那么为什么 UglifyJS.minify(inlineFilePath).code 不中断 gruntjs 任务?

看起来这是错误本身的问题:JS_Parse_Error 这不是一个正确构造的错误,不会被 grunt 捕获。看起来你必须自己抓住它并将它包装在 new Error() 中,就像你上面所做的那样,直到修复进入。请参见下面的 link:

https://github.com/mishoo/UglifyJS2/issues/348