流程控制语句本身不捕获异常,但可与try-catch-finally配合实现灵活错误处理;可在条件分支中主动throw抛出错误,由外层统一捕获,如输入非数字时抛出TypeError。

JavaScript中流程控制语句(如 if、for、while、switch)本身不直接参与异常捕获,但可以和 try-catch-finally 配合,在不同执行路径中灵活处理错误,让程序更健壮、逻辑更清晰。
在条件分支中主动抛出并捕获特定错误
当某些条件不满足时,可提前用 throw 抛出错误,再由外层 try-catch 统一处理,避免错误扩散或逻辑混乱。
- 例如:用户输入必须为正整数,否则抛出自定义错误
<!-- 示例 -->
function processNumber(input) {
try {
if (typeof input !== 'number') {
throw new TypeError('输入必须是数字');
}
if (input <= 0 || !Number.isInteger(input)) {
throw new RangeError('输入必须是正整数');
}
return input * 2;
} catch (err) {
console.error('处理失败:', err.message);
return null;
}
}在循环中逐项处理并隔离单次错误
遍历数组或对象时,某一项出错不应中断整个流程。把单次操作包进 try-catch 内部,配合 continue 或记录日志,实现“容错式遍历”。
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 适合数据清洗、批量接口调用、文件解析等场景
- 注意不要把整个循环包进一个
try,否则一次异常就退出全部
<!-- 示例 -->
const urls = ['https://api.a', 'https://invalid', 'https://api.b'];
const results = [];
<p>for (const url of urls) {
try {
const res = await fetch(url); // 可能抛出网络错误
results.push(await res.json());
} catch (err) {
console.warn(<code>请求 ${url} 失败,跳过:</code>, err.message);
continue; // 继续下一轮,不中断循环
}
}用 switch 匹配错误类型做差异化处理
catch 捕获的错误对象可通过 err.constructor.name 或 instanceof 判断类型,再用 switch 分支执行对应恢复策略。
- 比如:网络错误重试,验证错误提示用户,系统错误上报监控
- 比多个
if-else更清晰,尤其错误类型较多时
<!-- 示例 -->
try {
await loadData();
} catch (err) {
switch (err.constructor.name) {
case 'TypeError':
console.log('参数错误,请检查输入格式');
break;
case 'NetworkError': // 假设自定义类
case 'AbortError':
console.log('网络异常,稍后重试');
retryLoad();
break;
default:
console.error('未知错误,已上报', err);
reportError(err);
}
}结合 finally 确保清理逻辑不受流程影响
无论是否发生异常、是否进入 if 分支、循环是否提前 break,finally 中的代码都会执行,适合关闭资源、重置状态、隐藏加载框等。
- 常见于异步操作后的 UI 状态还原
- 避免因忘记写
catch或流程跳转导致资源泄漏
<!-- 示例 -->
let loading = true;
try {
showLoading();
if (needAuth()) {
await checkToken();
}
await fetchUserData();
} catch (err) {
handleError(err);
} finally {
loading = false;
hideLoading(); // 一定执行
}

















