错误处理是所有应用程序的重要组成部分。要抛出异常,请使用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) { /*www.w3cschool.cn*/ 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函数遵循的约定。