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 变量加上自定义错误类,能让每条出错路径都在类型层面清晰可见。