Node.js 错误和异常
错误处理是所有应用程序的重要组成部分。要抛出异常,请使用JavaScript的throw
关键字。在JavaScript中,通常使用 Error
对象和消息来表示错误。你抛出这个错误,以表示错误情况:
<p>The code above generates the following result.</p>
function a() {
throw new Error("Something bad happened!");
}
a();
捕获异常
你可以使用try/catch块捕获异常,如在其他语言中看到的:
function a () {
throw new Error("Something bad happened!");
}
try {
a();
} catch (e) {
console.log("I caught an error: " + e.message);
}
console.log("program is still running");
这个程序的输出是:
I caught an error: Something bad happened! program is still running
finally关键字
为了捕获异常,你可以使用catch关键字。对于要运行的代码,无论是否捕获到异常,都可以使用finally关键字。下面的代码显示了一个简单的例子来演示这个。
try {
console.log("About to throw an error");
throw new Error("Error thrown");
} catch (e) {
console.log("I will only execute if an error is thrown");
console.log("Error caught: ", e.message);
} finally {
console.log("I will execute irrespective of an error thrown");
}
catch部分只有在抛出错误时才执行。finally部分仍然执行,尽管在try部分中抛出了任何错误。
注意
这种异常处理方法非常适用于同步JavaScript。对于异步JavaScript,我们应该处理回调中的错误。
setTimeout(function () {
try {
console.log("About to throw an error");
throw new Error("Error thrown");
} catch (e) {
console.log("Error caught!");
}
}, 1000);
对于上面的代码,我们不能告诉代码外面的错误。考虑一个简单的getConnection函数回调我们需要在成功连接后调用。
function getConnection(callback) {
var connection;
try {
throw new Error("connection failed");
// Notify callback that connection succeeded?
} catch (error) {
// Notify callback about error?
}
}
我们需要通知回调关于成功和失败。这就是为什么Node.js有一个约定,如果有错误,调用回调的第一个参数的错误。如果没有错误,我们回调错误设置为null。Node.js的getConnection函数将类似于下面的内容。
function getConnection(callback) {
var connection;
try {
// Lets assume that the connection failed
throw new Error("connection failed");
// Notify callback that connection succeeded?
callback(null, connection);
} catch (error) {
// Notify callback about error?
callback(error, null);
}
}
// Usage
getConnection(function (error, connection) {
if (error) {
console.log("Error:", error.message);
} else {
console.log("Connection succeeded:", connection);
}
});
将错误作为第一个参数确保错误检查的一致性。这是所有具有错误条件的Node.js函数遵循的约定。