TypeScript 错误处理

程序运行中难免出错:网络超时、参数非法、文件缺失。若不处理,异常会一路向上抛出让程序崩溃。TypeScript 沿用 JavaScript 的 throw / try / catch 模型,并借助类型收窄让错误处理更可预测、更安全。

throw 抛出错误

throw 抛出任意值,实践中推荐抛 Error 及其子类并附带说明信息:

function divide(a: number, b: number): number {
  if (b === 0) {
    throw new Error("除数不能为 0");
  }
  return a / b;
}

try / catch / finally 结构

try 放可能出错的代码,catch 处理异常,finally 无论是否出错都会执行,常用于关闭连接、释放资源:

try {
  const r = divide(10, 0);
  console.log(r);
} catch (err) {
  // TS 4.4 起 catch 变量类型为 unknown,需先收窄再使用
  console.error("出错了:", err instanceof Error ? err.message : err);
} finally {
  console.log("本次计算结束");
}
// 输出:出错了: 除数不能为 0
// 输出:本次计算结束

自定义错误类

继承 Error 并添加额外字段,配合 instanceof 精确区分错误种类:

class HttpError extends Error {
  status: number;
  constructor(status: number, message: string) {
    super(message);
    this.name = "HttpError";
    this.status = status;
  }
}

async function fetchData(url: string): Promise<string> {
  if (!url.startsWith("https://")) {
    throw new HttpError(400, "只支持 https 请求");
  }
  return `数据来自 ${url}`;
}

async 函数里 throw 的异常会变成被拒绝的 Promise;下面 await 它,异常被重新抛出并进入 catch:

try {
  const data = await fetchData("http://example.com");
  console.log(data);
} catch (err) {
  if (err instanceof HttpError) {
    console.error(`HTTP ${err.status}:${err.message}`);
  } else {
    console.error("未知错误:", err);
  }
}
// 输出:HTTP 400:只支持 https 请求

小结

错误处理三原则:抛出时给出足够信息,捕获时用 instanceof 收窄类型,别忘了 finally。TypeScript 的 unknown 型 catch 变量加上自定义错误类,能让每条出错路径都在类型层面清晰可见。

笔记加载中…