直接用 throw err 即可原样抛出错误,保持原始类型和堆栈;若需补充上下文,可用 new Error('msg', { cause: err });避免 throw new Error(err) 或 throw 'msg' 等丢失信息的操作。

在 JavaScript 的 try...catch 中,如果想“捕获后重新抛出”错误(比如记录日志、做些清理,再让上层处理),直接用 throw 语句即可,无需额外参数——它会原样抛出当前 catch 接收到的错误对象。
直接 throw 原错误
这是最常见也最推荐的做法。捕获到错误后,你可以做日志、资源释放等操作,然后用 throw error 把同一个错误对象继续向上抛:
- 保持原始错误类型、堆栈信息(stack trace)基本不变
- 上层
try...catch或全局错误监听仍能拿到完整上下文
示例:
```jstry {
JSON.parse('{"invalid": }'); // 抛出 SyntaxError
} catch (err) {
console.error('解析失败:', err.message);
throw err; // 原样抛出,堆栈保留原始位置
}
包装错误再抛出(增强可读性)
如果想补充上下文(比如说明“这是用户配置解析失败”),可以创建新错误并把原错误作为 cause(ES2022+ 支持):
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 新错误的
cause属性指向原错误,调试时可追溯 - 兼容性注意:Node.js ≥16.9、Chrome ≥100、Firefox ≥101 支持
cause
示例:
```jstry {
loadConfig();
} catch (err) {
throw new Error('加载用户配置失败', { cause: err });
}
避免常见陷阱
-
不要写
throw new Error(err):这会丢失堆栈和原始错误类型,变成普通Error -
不要只写
throw 'msg':字符串不是错误对象,无法访问stack或name -
慎用
err.message + '(自定义)'拼接再抛:虽可行,但丢失了cause和类型信息,不利于调试
异步场景中注意 await + try catch
在 async 函数里,被 reject 的 Promise 会被 catch 捕获为错误对象,同样适用 throw err:
async function fetchData() {
try {
await fetch('/api/data').then(r => r.json());
} catch (err) {
console.warn('API 请求异常');
throw err; // 照常抛出,调用方可 await 或 .catch()
}
}

















