我一直在努力处理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。
答案 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()来执行逻辑,但会给你一个堆栈跟踪,告诉你错误发生的确切位置。