LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 310|回复: 0

错误处理,"try...catch"

[复制链接]
发表于 2024-1-20 23:32:06 | 显示全部楼层 |阅读模式
不管你多么精通编程,有时我们的脚本总还是会出现错误。可能是因为我们的编写出错,或是与预期不同的用户输入,或是错误的服务端响应以及其他数千种原因。

通常,如果发生错误,脚本就会“死亡”(立即停止),并在控制台将错误打印出来。

但是有一种语法结构 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);

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表