为什么Ember.onerror()没有捕获Assertion Failed错误。?

时间:2014-01-21 10:37:11

标签: ember.js

我的代码中有一种情况,我需要跟踪生产中的错误。

我使用ember.js作为我的框架。

要跟踪生产中出现的错误,我使用Ember.Onerror,它只提供任何功能错误跟踪。

Ember.onerror = function(error) {
  Em.$.ajax('/error-notification', 'POST', {
    stack: error.stack,
    otherInformation: 'exception message'
  });
}

但我想跟踪断言失败的错误,例如

网址* 未与您应用中的任何路由器匹配 *

2 个答案:

答案 0 :(得分:3)

关于Ember关于捕获错误和断言错误的文档确实很少。就我而言,在进入生产之前,我需要在调试模式下将这些异常可视化到控制台之外。所以,我去了GitHub的Ember项目,找到了Ember.onerror(错误){...}和Ember.assert(desc,test){...}函数的规范和实现,然后我写了我的我决定将errorHandler命名为新适配器(app / initializers文件夹)的初始化函数内的这些函数的自有版本。

Ember.assert = function(desc, test) {
    if (!test) {
        console.log('This is a test to log Assertions!');
        /* your assertion treatment code goes here*/
        throw new Ember.Error("Assertion Failed: " + desc);
    }
}

...并且通过抛出你实际上正在调用的新Ember.Error(...):

Ember.onerror = function(error) {
    console.log("An error has occurred in ember: " + error.message);
    /* your error treatment code goes here*/
};

答案 1 :(得分:0)

Ember的构建工具会删除断言/调试调用,例如Ember.assert(),因此如果您使用ember.prod.jsember.min.js,则不会获得断言。

API docs for Ember.assert()

  

定义一个断言,如果条件是,将抛出异常   没见过。 Ember构建工具将删除对Ember.assert()的任何调用   在进行生产构建时。例如:

    // Test for truthiness
    Ember.assert('Must pass a valid object', obj);
    // Fail unconditionally
    Ember.assert('This code path should never be run')