try / catch / throw 与自定义错误

每点一个按钮,控制台会输出这次操作的表达式和真实结果。未捕获的错误会跑到全局,被最下面的全局监听打出来。

[迷你控制台]

一、try 块里出错,剩下的都不执行

function runSteps() {
  log('步骤 1:准备数据')
  JSON.parse('{oops}')        // 抛 SyntaxError
  log('步骤 3:这一行不会执行')
}

二、throw 自定义错误:ValidationError

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          // 不认识的:原样再抛,交给上层
  }
}

四、finally:无论成败都执行

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 是运行时的,能拦看情况