【发布时间】:2011-08-14 13:23:51
【问题描述】:
我是 node.js 的新手,虽然我对 JavaScript 非常熟悉。我的问题是关于如何处理 node.js 中的错误的“最佳实践”。
通常在以各种语言编写 Web 服务器、FastCGI 服务器或网页时,我在多线程环境中使用带有阻塞处理程序的异常。当一个请求进来时,我通常会做这样的事情:
function handleRequest(request, response) {
try {
if (request.url=="whatever")
handleWhateverRequest(request, response);
else
throw new Error("404 not found");
} catch (e) {
response.writeHead(500, {'Content-Type': 'text/plain'});
response.end("Server error: "+e.message);
}
}
function handleWhateverRequest(request, response) {
if (something)
throw new Error("something bad happened");
Response.end("OK");
}
这样我总是可以处理内部错误并向用户发送有效的响应。
我知道使用 node.js 应该进行非阻塞调用,这显然会导致各种数量的回调,就像在这个例子中一样:
var sys = require('sys'),
fs = require('fs');
require("http").createServer(handleRequest).listen(8124);
function handleRequest(request, response) {
fs.open("/proc/cpuinfo", "r",
function(error, fd) {
if (error)
throw new Error("fs.open error: "+error.message);
console.log("File open.");
var buffer = new require('buffer').Buffer(10);
fs.read(fd, buffer, 0, 10, null,
function(error, bytesRead, buffer) {
buffer.dontTryThisAtHome(); // causes exception
response.end(buffer);
}); //fs.read
}); //fs.open
}
此示例将完全终止服务器,因为没有捕获异常。 我的问题在这里,我不能再使用单个 try/catch,因此通常无法捕获在处理请求期间可能引发的任何错误。
当然,我可以在每个回调中添加一个 try/catch,但我不喜欢这种方法,因为这取决于程序员,他不会忘记 try/catch。对于具有许多不同且复杂的处理程序的复杂服务器,这是不可接受的。
我可以使用全局异常处理程序(防止服务器完全崩溃),但我无法向用户发送响应,因为我不知道哪个请求导致了异常。这也意味着请求保持未处理/打开状态,并且浏览器一直在等待响应。
有人有好的、坚如磐石的解决方案吗?
【问题讨论】:
标签: javascript exception-handling callback node.js