1

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

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

这一直很好,直到我注意到一些编程错误导致整个应用程序非常安静地崩溃。即没有写入控制台,没有捕获错误,应用程序只是挂在激活功能上。

这是预期的行为。我应该将我的应用程序的应用程序逻辑移动到其他地方吗?

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

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

    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;
}

本质上,运行捕获条件并调用系统错误。结果似乎消失在淘汰赛绑定等中。无论如何,有没有让这个错误更明显。现在我坚持在 activator.js 激活函数上放置一个断点。

我正在使用 v2.0.1 的 durandal。

4

1 回答 1

0

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

例如在您的初始引导模块中

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 系统、路由器和 jquery 的内部方法。你仍然需要四处寻找有问题的线路。

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

于 2014-04-23T08:40:00.523 回答