JavaScript try...catch...finally 语句
- 错误处理机制:JavaScript 的
try...catch...finally
语句用于处理异常(程序运行中的错误)。这包括语法错误(编码错误)和运行时错误(执行期间的错误)。 - try...catch 结构:
try
代码块包含主要代码。如果在执行try
块时发生错误,控制流将转到catch
块。catch
块处理异常并接收错误对象作为参数。 - try...catch...finally 用法:
finally
代码块无论代码成功执行还是发生错误都会执行。try...catch
无法捕获 "定时" 代码(如setTimeout()
)中的异常,异常处理必须放在定时函数内部。
try
、catch
和 finally
代码块被用来处理异常(一种错误类型)。在学习它们之前,你需要了解编程中的错误类型。
错误类型
在编程中,代码中可能存在两种类型的错误:
语法错误(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
语句后使用 catch
或 finally
语句。否则,程序将抛出错误 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 语句。