在Dojo中吞噬了Javascript错误

时间:2014-06-10 11:01:26

标签: javascript logging dojo console.log uncaught-exception

我正在使用Dojo 1.8.1,并且经常发生在未被捕获的引用错误(例如:访问非现有函数/变量/对象成员)的情况下,脚本将在控制台上没有任何消息的情况下静默失败也没有错误,使调试过程变得更慢(更多)!

通常这发生在对函数的一系列调用之后(我可能是错的)它似乎在使用“dojo / request”对象的休息调用之后更频繁地发生。这种行为可能是随机发生的,因此未被捕获的引用错误可能会被抛出或吞没,而不会在同一行上进行任何预测,很可能是基于函数的调用者。

这里有一个我用所描述的问题做的例子:

define([ "dojo/dom", "dojo/dom-construct", "dojo/request", "dojo/ready" ], 
function(dom, domConstruct, request) {

    var prettyDate = function (millisecDate) {

        // wrong: console won't display the error, script will stop
        // uncaughtReferenceError['notExistingIndex']; 
        // uncaughtReferenceError.notExistingMethod(); 

        // if commented, script will stop at "return" line without errors on console
        var date = new Date(millisecDate);
        // same here, if commented "return" should throw the exception
        var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
        // any misspell on the "date"  methods will cause the script to fail without logs (eg: getUTCYear() instead of getUTCFullYear())
        return  date.getUTCDate() + ' ' + months[date.getUTCMonth()] + ' ' + date.getUTCFullYear();

    };

    var startup = function(domNode) {

        // uncaughtReferenceError['notExistingIndex']; // correct: console will display the error and script will stop
        // uncaughtReferenceError.notExistingMethod(); // same here

        request.get("rest/repository/", {handleAs: "json"}).then(
                function(result){
                    var ul = domConstruct.create("ul", {  }, domNode);
                    result.repositories.forEach(function(repo) {
                        domConstruct.create("li", { innerHTML : prettyDate(repo.lastUpdated) }, ul);
                    });
                });

    };

    return { init: startup };

});

Dojo配置为isDebug为true,但没有区别:

<script>
    dojoConfig = {
        async : true,
        isDebug : true,
        parseOnLoad : true,
        baseUrl : "js/",
        packages : [ { name : "dsmonitor", location : "dsmonitor" } ]
    };
</script>

这里是正确的页面(一切正常,代码是最顶层的): everything is working

如果我将错误放在启动方法中(页面加载将停止但显示错误,则启动时未注释uncaughtReferenceError): enter image description here

这里如果我把错误放在prettyDate函数中(页面加载将停止并且没有显示错误,则在prettyDate中没有注释uncaughtReferenceError,实际情况下的调试会变得很糟糕): enter image description here

我不知道我是否是遇到这个问题的唯一一个人,或者我做了什么特别错误的事情,但是在我的许多项目中都会发生这种情况(而且我被迫放入了大量的console.log打电话来了解发生了什么)我无法在互联网上找到任何可能的解决方案!

2 个答案:

答案 0 :(得分:0)

我发现从外部服务器导入dojo库时会发生这种情况(例如: // ajax.googleapis.com/ajax/libs/dojo/1.8.1/dojo/dojo.js)。

如果我想在休息回调失败时在控制台中看到非预期错误,我必须在网站的同一服务器/端口上安装dojo库。

由于这会减慢Eclipse中的开发速度(验证完整的库很慢),我发现webjar可以缓解一点喧嚣!

希望它有所帮助!

答案 1 :(得分:0)

您可能遇到问题,因为您的代码在DOM准备好使用之前不会等待。

您正在使用:

define(["dojo/dom", "dojo/dom-construct", "dojo/request", "dojo/ready"],
  function(dom, domConstruct, request) {
  });

根据Dojo domReady页面,你应该像这样使用domReady插件:

define(["dojo/dom", "dojo/dom-construct", "dojo/request", "dojo/domReady!"],
       function(dom, domConstruct, request) {}
);

作为替代方案,如果你想使用ready函数,你必须这样做:

define(["dojo/dom", "dojo/dom-construct", "dojo/request", "dojo/ready"],
  function(dom, domConstruct, request, ready) {
    ready(function() {});
  });