【问题标题】:Why doesn't GruntJS break execution if exception is thrown?如果抛出异常,为什么 GruntJS 不会中断执行?
【发布时间】:2016-12-20 15:37:19
【问题描述】:

我正在探索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 执行,那就太好了。

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

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 任务?

【问题讨论】:

    标签: javascript gruntjs inline uglifyjs


    【解决方案1】:

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

    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() 中,就像您在上面所做的那样,直到修复进入。请参阅下面的链接:

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

    【讨论】:

    • 感谢您的回答。但是,为什么如果我能从UglifyJS.minify 捕获异常,它就不是破口大骂?请查看我更新的帖子
    • Grunt 只处理附加到 grunt 对象的异常。grunt 对象应该用于与 gruntjs 通信。 gruntjs.com/api/grunt
    • 这有点不对。正如我在上面的帖子更新中所描述的,如果我自己抛出异常,grunt 会很好地中断。
    • 你是对的问题是错误本身引发的。查看更新。
    • 感谢您的研究!
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多