例如,我只是天真地试图抓住ENOENT
:
try {
res.sendFile(path);
} catch (e) {
if (e.code === 'ENOENT') {
res.send('placeholder');
} else { throw e; }
}
这不起作用!
我 知道 ,正确的方法是使用sendFile
的错误回调,但对我来说这真的令我感到惊讶和不好例外的基本语言特征在这里不起作用。
我想也许表达自己正在捕捉。并且他们希望不会错误地杀死服务器。这是可以理解的。
但我只是得到了这个蹩脚的信息:
Error: ENOENT: no such file or directory, stat '<file>'
at Error (native)
不太好。
答案 0 :(得分:3)
由于documentation res.sendFile
是异步功能,因此try/catch
在这种情况下不起作用。如果您想处理res.sendFile
结果,则必须将callback
作为最后一个参数传递。
res.sendFile(path, function (e) {
if (e) {
if (e.code === 'ENOENT') {
res.send('placeholder');
} else {
throw e;
}
}
});
答案 1 :(得分:2)
由于Javascript的异步特性,代码无法捕获您抛出的异常。 res.sendFile
在try
块的范围之外执行,try
块执行将在调用res.sendFile
方法后结束。
这就是为什么总是建议使用带有错误对象的回调机制作为回调的第一个参数的原因,你可以在继续之前先检查它
res.sendFile(path, function (e) {
// check the error first
// then procedd with the execution
});
答案 2 :(得分:1)
一般来说,您希望避免使用异常来控制程序流。
此外,由于您显然在Node.js中对此进行编程,因此您传递了一个回调函数以保持Node异步运行。 Node.js不是多线程的,因为JavaScript不是多线程的,所以它一次不能有多个东西。这意味着如果您的代码挂起处理异常,则不会发生任何其他事情。例外是昂贵的。在单线程服务器端应用程序中进行昂贵的清理会损害性能和可伸缩性。 JavaScript本身也不是神奇的异步。只有在使用回调函数放松它时它才是异步的。
因此,当您将回调函数传递给res.send时,当res.send函数完成时(或由于错误退出而没有完成),该函数将被异步调用,而不会产生抛出异常的开销。因此,如果您想处理错误,那么传递回调方法就是这样做的。