每点一个按钮,控制台会输出这次操作的表达式和真实结果。未捕获的错误会跑到全局,被最下面的全局监听打出来。
function runSteps() {
log('步骤 1:准备数据')
JSON.parse('{oops}') // 抛 SyntaxError
log('步骤 3:这一行不会执行')
}
class ValidationError extends Error {
constructor(field, message) {
super(message) // 让 Error 装好 message / stack
this.name = 'ValidationError' // 覆盖掉默认的 "Error"
this.field = field // 自定义信息:出错的是哪个字段
}
}
function validateAge(value) {
const age = Number(value)
if (!value.trim() || !Number.isInteger(age) || age < 0 || age > 150) {
throw new ValidationError('age', '年龄必须是 0–150 之间的整数')
}
return age
}
catch (err) {
if (err instanceof ValidationError) {
// 认识的:就地处理
} else {
throw err // 不认识的:原样再抛,交给上层
}
}
function readSetting() {
try {
log('打开资源…')
throw new Error('模拟读取失败')
} catch (err) {
log(`catch:${err.message}`)
return '默认值' // return 先被暂存
} finally {
log('finally:释放资源') // finally 先跑完,再真正返回
}
}
| 类型 | 典型触发 | try/catch 能拦吗 |
|---|---|---|
| TypeError | 对 null / undefined 读属性、把非函数当函数调 | 能(运行时) |
| ReferenceError | 引用了不存在的变量名 | 能(运行时) |
| RangeError | 数值越界,如 new Array(-1) | 能(运行时) |
| SyntaxError | 代码本体的语法错误:解析阶段就挂,拦不到;但 JSON.parse 的坏数据抛的 SyntaxError 是运行时的,能拦 | 看情况 |