跳转到主要内容
模块 5 · 第 4 课(共 4)课程中的20/32~12 min
模块课程(4/4)

尝试/捕捉/抛出

JavaScript 中的 错误 是一个中断正常流程的值(通常是 Error 对象) 并使调用堆栈冒泡,直到有人捕获它。处理这种情况的构造是 try / catch。

抛出错误:throw

JS
function dividi(a, b) {
  if (b === 0) {
    throw new Error('Divisione per zero');
  }
  return a / b;
}

throw 立即中断当前函数。

捕获:try / catch

JS
try {
  const r = dividi(10, 0);
  console.log('ok', r);
} catch (err) {
  console.log('errore:', err.message); // 'errore: Divisione per zero'
}

// Il programma continua qui, anche se c'è stato un errore.

try 内的所有内容都会被执行;如果抛出错误(通过 throw 或任何操作 失败),控制跳转到 catch 块。 catch (...) 之后的变量收到错误。

finally(可选)

无论错误与否,始终运行的代码。对于关闭资源很有用:

JS
try {
  // ... operazione rischiosa
} catch (err) {
  // ... log
} finally {
  // ... pulizia (sempre eseguita)
}

何时使用(以及何时不使用)

  • 是:I/O 操作(不受信任的输入上的 JSON.parse、fetch、磁盘访问)、转换 可能会失败。
  • 也许不是:对于正常流程。如果您知道输入可能无效,最好检查一下 与 if 相比,抛出并捕获。
JS
// Tipico: parsing JSON difensivo
function parseJsonSafe(text) {
  try {
    return { ok: true, value: JSON.parse(text) };
  } catch (err) {
    return { ok: false, error: err.message };
  }
}

parseJsonSafe('{"a":1}'); // { ok: true, value: {a:1} }
parseJsonSafe('non json'); // { ok: false, error: '...' }

尝试一下

锻炼#js.m5.l4.e1
尝试:0加载中...

定义“safeDivide(a, b)”:如果 b 为 0,则抛出错误并显示消息“除以零”,否则返回 a/b。

正在加载编辑器...
显示提示

if (b === 0) 抛出新错误('...');然后返回a/b。

3 次尝试后可用的解决方案

复习练习

锻炼#js.m5.l4.e2
尝试:0加载中...

定义 `parseJsonSafe(text)`:如果文本是有效的 JSON,则返回 { ok: true, value: <object> },否则 { ok: false }。在 JSON.parse 上使用 try/catch。

正在加载编辑器...
显示提示

将 JSON.parse 包装在 try 中;在 catch 中返回 { ok: false }。

3 次尝试后可用的解决方案