为什么我使用'throw new Error'时没有看到堆栈跟踪?

4

在使用以下简单代码测试节点服务器时,为什么会出现以下错误?

code/app2/i.js:35
        throw new Error("here")
              ^
Error: here

根据《Smashing node.js》一书中的内容,我期望看到堆栈跟踪(点击获取该书)。下面是相关的第35页的图片:(点击查看)

* node uncaught-http-js

/uncaught-http.js:4
  throw new Error("here");
        ^
Error: This will be uncaught
    at Server.<anonymous> (/uncaught-http.js:4:9)
    at Server.emit(events.js:70:17)
    at HttpParser.onIncoming(http.js:1514:12)
    at HttpParser.onHeadersComplete(http.js:102:31)
    at Socket.andata (http.js:1410:22)
    at TCP.onread(net.js:354:27)

但事实并非如此。

以下是代码。

function c () {
    b();
};
function b () {
    a();
};

function a () {
    setTimeout(function () {
        throw new Error('here');
    }, 10);
};

c();

5
因为你抛出了一个错误吗?还是你在问其他的事情? - Bogdan
3
你遇到了一个 JavaScript 错误,因为 throw new Error('here') 明确地告诉 JavaScript 输出错误信息。你的问题基本上相当于:“我有 alert('hi!'),为什么这段代码会显示一个弹出框?!” - CrayonViolent
1
你抛出错误的方式没有问题。它抛出了预期的错误(“here”)。位置无关紧要;new 操作符是正确的。 - Sebastian Simon
4
记录一下,@AgentZebra,我非常确定在Error: here这行上面的两行是堆栈跟踪 - Aify
1
@badp 可能(很可能?)被省略了,我猜测。 - fredley
显示剩余6条评论
3个回答

19

你没有看到整个堆栈跟踪是因为你在 A() 中 异步 地抛出了错误(使用 setTimeout)。如果你同步地抛出它 - 你会看到跟踪 c()->b()->a()。

试一下:http://jsbin.com/yirorimewe/1/edit?js,console


听起来对我来说,这应该是被接受的答案。 - gil_bz

6

以下是您的代码执行过程:

调用方法'c',该方法调用方法'b',该方法调用方法'a',在方法'a'中抛出了一个错误(方法'a'中有一个throw error语句)。

您发布的内容就是堆栈跟踪(显示了错误发生的文件中的行)。


1
根据《Smashing Node.Js》一书,这应该给我一个堆栈跟踪,但它没有。也许这就是我的困惑所在。不过还是谢谢你的帮助。 - Agent Zebra
2
@AgentZebra:http://stackoverflow.com/help/how-to-ask 如果输出结果与您的期望不符,则问题应包含预期输出和实际输出,以便我们提供有效的反馈。谢谢。 - Mooing Duck
1
感谢 @MooingDuck,期望输出在截图中,我怎么把它包含在这里? - Agent Zebra
1
@AgentZebra 当编辑问题时,应该有一个附加图像文件的按钮。实际上,尽可能使用文本输出更好。 - Mooing Duck

-4

该函数正在显示输出。抛出新错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接