【发布时间】:2014-01-26 06:37:58
【问题描述】:
我正在使用 Cujo 出色的 When 库为我的 Node 项目提供 Promises/A+ 实现,尽管这个问题不是特定于节点的。
一般来说,什么时候很棒:它让我可以编写更易维护、更易读的代码。
但是,当我的回调意外失败(访问空变量的属性等)时,异常会被When 有效地吞没,就像 Promises/A+ 规范中的specified 一样。不幸的是,这意味着我没有得到任何关于错误的反馈(除了回调在那个时候停止执行)。没有错误类型或消息,没有行号。
举例说明:
// hypothetical asynchronous database query
database.query(queryDetails).then(function(result) {
var silly = 3.141592654;
silly(); // TypeError: number is not a function!
process(result); // this code is silently never executed
});
我能想到一些(不可接受的)方法来解决这个问题:
- 为每个
then调用提供失败回调(将原因/异常转储到控制台) - 将所有回调主体包装在 try-catch 中
- 在代码库中乱扔“标志性日志”ala
console.log('I got here 123')
我只是做错了吗?当然,并不是只有我一个人发现基于 Promise 的代码的可调试性很差。我是否缺少明显的解决方案?
【问题讨论】:
-
首选 Bluebird 而不是何时。它有 AMAZING 堆栈跟踪(好多了)。哦,不用担心性能,它也快得多。此外,bluebird 将未处理的异常记录到 stderr(通常是控制台),并带有完整的堆栈跟踪。它还可以通过 catch 等进行非常好的错误处理。
-
谢谢本杰明 - 这是一个答案吗?
-
不,这是我自己处理问题后的图书馆建议。图书馆建议是不好的答案:) 我不确定“When”是否有一个好的 unhandledExceptionHandler。老实说,与 Bluebird 相比,Node 中所有其他的 Promise 库都显得非常幼稚。
-
unhandledExceptionHandler!!现在只是阅读它,它有一个“监视器”。太奇怪了,这个问题没有被 Promises/A+ 规范处理......
-
Promises/A+ 规范并不是要进行实际的 Promise 实现(它甚至没有指定创建 Promise 的方法),而是对良好互操作的最低要求。
标签: javascript node.js debugging promise