我有一个简单的test.coffee,它编译成test.js
test.coffee
process.on 'uncaughtException', (er) ->
console.log 'Unhandled exception'
console.log 'Unhandled exception'
console.log 'Unhandled exception'
console.log 'Unhandled exception'
console.log 'Unhandled exception'
console.log 'Unhandled exception'
console.log 'Unhandled exception'
console.log 'Unhandled exception'
return
throw new Error("aAH")
制作的test.js
(function() {
process.on('uncaughtException', function(er) {
console.log('Unhandled exception');
console.log('Unhandled exception');
console.log('Unhandled exception');
console.log('Unhandled exception');
console.log('Unhandled exception');
console.log('Unhandled exception');
console.log('Unhandled exception');
console.log('Unhandled exception');
});
throw new Error("aAH");
}).call(this);
从命令行或从vim via(!node%和!coffee%)等,输出出乎意料地不同。
node test.js行为正确并将几个Unhandled异常行输出到控制台并退出。通过'coffee test.coffee'调用可以回退到打印堆栈跟踪和退出的默认行为。这个示例显然不是我的完整应用程序,但做一个更大的应用程序我无法通过coffee boot.cofee启动ExpressJS应用程序时无法处理未处理的异常,我做错了什么?这是最新的Node 0.4.8和Mac OS X 10.6.x上的最新Cofee 1.1.1
答案 0 :(得分:4)
当您通过coffee
命令运行CoffeeScript代码时,代码将编译为JS,然后在Node进程中以编程方式运行。特别是,CoffeeScript使用命令
mainModule._compile code, mainModule.filename
(请参阅coffee-script.coffee),其中mainModule
是对require.main
的引用。这就是为什么在堆栈跟踪中,你应该看到
Error: aAH
at Object. (.:12:9)
at Object. (.:13:4)
at Module._compile (module.js:404:26)
...
您遇到的一个副作用是异常永远不会一直到process
级别。相反,感谢这个代码
try
...
else if o.run then CoffeeScript.run t.input, t.options
...
catch err
...
<{3>}中的。
当您运行coffee foo.coffee
时,CoffeeScript需要几个步骤来模拟“纯”Node.js进程,但是直接运行CoffeeScript和运行已编译的JS之间总会存在一些差异。对于您正在开发的复杂应用程序,我建议设置一个Cakefile,以便您可以在保存时自动重新编译,测试和运行您的应用程序,而不是使用编辑器的内置运行命令。