Durandal中的错误激活功能

时间:2014-04-23 08:25:11

标签: durandal-2.0 durandal-navigation

我一直在努力处理durandal中的错误处理。

我发现在激活函数中放置大量用于渲染视图等的逻辑是可取的。

这很好用,直到我注意到一些编程错误导致整个应用程序非常默默地摔倒。即没有写入控制台,没有被困错误,应用程序只挂在激活功能上。

这是预期的行为吗?我应该将应用程序逻辑移到别处吗?

实际的代码有点尴尬,很多都包含在jquery promises等中。

为了证明我所看到的,我写了以下内容:

    public activate(stationId: string): void {
        throw "Error in detail activate";
    }

除了挂起应用程序之外,没有向控制台写任何内容并且没有引起其他明显错误。

发生的直接事情:

    public activate(stationId: string): void {
        setTimeout(function() { 
            throw "Error in detail activate";
        }, 0);
    }

在这种情况下,激活功能会进行,但不幸的是,无法跟踪此错误吗?

我担心我需要找到一种在激活点执行应用逻辑的方法,但如果不是简单地吞下这些错误就会很有用。

多做一点调查并深入挖掘Durandal。

错误仍然消失。尽管Durandal明显尝试记录错误。我一直在寻找activator.js激活功能:

try {
    result = invoke(newItem, 'activate', activationData);
} catch (error) {
    system.error(error);
    callback(false);
    return;
}

基本上运行catch条件并调用系统错误。结果似乎消失在敲除绑定等等。无论如何,这个错误更明显。现在我不得不在activator.js激活功能上设置一个断点。

使用durandal的v2.0.1。

1 个答案:

答案 0 :(得分:0)

启用system.debug。这将让durandal将这些错误记录到控制台。

E.g。在您的初始启动模块

define(['durandal/app', 'durandal/viewLocator', 
    'durandal/system', 'plugins/router', 'services/logger'], boot);

function boot (app, viewLocator, system, router, logger) {

    // Enable debug message to show in the console 
    system.debug(true);

    // and so on
}

这适用于canActivate(),当您使用setTimeout()时,它也适用于activate()。但是,如果没有setTimeout(),它似乎在activate()中不起作用。

<强>调试:

在不调用setTimeout的情况下执行canActivate()中的逻辑将导致堆栈跟踪仅包含来自durandal system,router和jquery的内部方法。你仍然需要四处寻找违规行。

通过调用setTimeout()来执行逻辑,但会给你一个堆栈跟踪,告诉你错误发生的确切位置。