|
不管你多么精通编程,有时我们的脚本总还是会出现错误。可能是因为我们的编写出错,或是与预期不同的用户输入,或是错误的服务端响应以及其他数千种原因。
通常,如果发生错误,脚本就会“死亡”(立即停止),并在控制台将错误打印出来。
但是有一种语法结构 try...catch,它使我们可以“捕获(catch)”错误,因此脚本可以执行更合理的操作,而不是死掉。
“try…catch” 语法
try...catch 结构由两部分组成:try 和 catch:
try {
// 代码...
} catch (err) {
// 错误捕获
}
它按照以下步骤执行:
首先,执行 try {...} 中的代码。
如果这里没有错误,则忽略 catch (err):执行到 try 的末尾并跳过 catch 继续执行。
如果这里出现错误,则 try 执行停止,控制流转向 catch (err) 的开头。变量 err(我们可以使用任何名称)将包含一个 error 对象,该对象包含了所发生事件的详细信息。
所以,try {...} 块内的 error 不会杀死脚本 —— 我们有机会在 catch 中处理它。
让我们来看一些例子。
没有 error 的例子:显示 alert (1) 和 (2):
try {
alert('开始执行 try 中的内容'); // (1) <--
// ...这里没有 error
alert('try 中的内容执行完毕'); // (2) <--
} catch (err) {
alert('catch 被忽略,因为没有 error'); // (3)
}
包含 error 的例子:显示 (1) 和 (3) 行的 alert 中的内容:
try {
alert('开始执行 try 中的内容'); // (1) <--
lalala; // error,变量未定义!
alert('try 的末尾(未执行到此处)'); // (2)
} catch (err) {
alert(`出现了 error!`); // (3) <--
}
try...catch 仅对运行时的 error 有效
要使得 try...catch 能工作,代码必须是可执行的。换句话说,它必须是有效的 JavaScript 代码。
如果代码包含语法错误,那么 try..catch 将无法正常工作,例如含有不匹配的花括号:
try {
{{{{{{{{{{{{
} catch (err) {
alert("引擎无法理解这段代码,它是无效的");
}
JavaScript 引擎首先会读取代码,然后运行它。在读取阶段发生的错误被称为“解析时间(parse-time)”错误,并且无法恢复(从该代码内部)。这是因为引擎无法理解该代码。
所以,try...catch 只能处理有效代码中出现的错误。这类错误被称为“运行时的错误(runtime errors)”,有时被称为“异常(exceptions)”。
try...catch 同步执行
如果在“计划的(scheduled)”代码中发生异常,例如在 setTimeout 中,则 try...catch 不会捕获到异常:
try {
setTimeout(function() {
noSuchVariable; // 脚本将在这里停止运行
}, 1000);
} catch (err) {
alert( "不工作" );
}
因为 try...catch 包裹了计划要执行的函数,该函数本身要稍后才执行,这时引擎已经离开了 try...catch 结构。
为了捕获到计划的(scheduled)函数中的异常,那么 try...catch 必须在这个函数内:
setTimeout(function() {
try {
noSuchVariable; // try...catch 处理 error 了!
} catch {
alert( "error 被在这里捕获了!" );
}
}, 1000);
|
|