模块 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 次尝试后可用的解决方案