跳到主要内容

JavaScript try...catch...finally 语句

提示
  1. 错误处理机制:JavaScript 的 try...catch...finally 语句用于处理异常(程序运行中的错误)。这包括语法错误(编码错误)和运行时错误(执行期间的错误)。
  2. try...catch 结构try 代码块包含主要代码。如果在执行 try 块时发生错误,控制流将转到 catch 块。catch 块处理异常并接收错误对象作为参数。
  3. try...catch...finally 用法finally 代码块无论代码成功执行还是发生错误都会执行。try...catch 无法捕获 "定时" 代码(如 setTimeout())中的异常,异常处理必须放在定时函数内部。

trycatchfinally 代码块被用来处理异常(一种错误类型)。在学习它们之前,你需要了解编程中的错误类型。

错误类型

在编程中,代码中可能存在两种类型的错误:

语法错误(Syntax Error):语法上的错误。例如,如果你写 consol.log('your result');,上述程序将抛出一个语法错误。上述代码中 console 的拼写是错误的。

运行时错误(Runtime Error):这种类型的错误在程序执行期间发生。例如,调用一个无效的函数或变量。

在运行时发生的这些错误被称为异常。现在,让我们看看你如何处理这些异常。

JavaScript try...catch 语句

try...catch 语句用于处理异常。其语法是:

try {
// try 代码块
} catch (error) {
// catch 代码块
}

主要代码位于 try 代码块内。在执行 try 代码块时,如果发生任何错误,它会进入 catch 代码块。catch 代码块根据 catch 语句处理错误。

如果没有发生错误,try 代码块内的代码将被执行,catch 代码块将被跳过。

示例 1:显示未声明的变量

// 程序展示 try...catch 的使用

const numerator = 100,
denominator = "a";

try {
console.log(numerator / denominator);

// 忘记定义变量 a
console.log(a);
} catch (error) {
console.log("捕获到一个错误");
console.log("错误信息:" + error);
}

输出

NaN
捕获到一个错误
错误信息:ReferenceError: a is not defined

在上述程序中,一个变量没有定义。当你尝试打印变量 a 时,程序抛出一个错误。该错误在 catch 代码块中被捕获。

JavaScript try...catch...finally 语句

你也可以使用 try...catch...finally 语句来处理异常。无论代码是否成功运行或发生错误,finally 代码块都会执行。

try...catch...finally 代码块的语法是:

try {
// try 代码块
}
catch(error) {
// catch 代码块
}
finally() {
// 无论如何都会执行的代码
}

示例 2:try...catch...finally 示例

const numerator = 100,
denominator = "a";

try {
console.log(numerator / denominator);
console.log(a);
} catch (error) {
console.log("捕获到一个错误");
console.log("错误信息:" + error);
} finally {
console.log("Finally 将每次都执行");
}

输出

NaN
捕获到一个错误
错误信息:ReferenceError: a is not defined
Finally 将每次都执行

在上述程序中,发生了一个错误并被 catch 代码块捕获。finally 代码块将在任何情况下执行(无论程序是否成功运行或发生错误)。

注意:你需要在 try 语句后使用 catchfinally 语句。否则,程序将抛出错误 Uncaught SyntaxError: Missing catch or finally after try.

JavaScript try...catch 在 setTimeout 中的使用

如果异常发生在“定时”代码中,如 setTimeout()try...catch 将无法捕获异常。例如,

try {
setTimeout(function () {
// 代码中的错误
}, 3000);
} catch (e) {
console.log("不会起作用");
}

上述 try...catch 将不起作用,因为引擎已经离开了 try..catch 结构,而函数稍后才执行。

try..catch 代码块必须在该函数内部,以捕获定时函数内的异常。例如,

setTimeout(function () {
try {
// 代码中的错误
} catch {
console.log("错误被捕获");
}
}, 3000);

你也可以使用 throw 语句与 try...catch 语句一起使用,以使用用户定义的异常。例如,某个数字被 0 除。如果你想将 Infinity 视为程序中的一个错误,那么你可以使用 throw 语句抛出一个用户定义的异常来处理这种情况。

你将在下一个教程中了解 JavaScript throw 语句