自定义错误
在 TypeScript 中,既可以自定义错误的触发时机,主动抛出错误,人为地造成程序异常中断,也可以创建自定义错误类型。下面将分别介绍这两种方法。
抛出错误
在 TypeScript 中,除被动检测错误之外,还可以通过 throw 关键字主动抛出错误,其语法如下。
throw 错误对象;
执行 throw 语句等同于该语句产生了错误,代码会立即停止执行,除非使用 try/catch 语句捕获了抛出的错误。
可以用构造函数的形式实例化新的错误对象,例如,TypeScript 中的内置错误对象(参考上一节)可以通过以下方式实例化。
new 内置错误类型(自定义错误消息);
抛出内置错误的示例代码如下。
throw new SyntaxError("无法识别语法");
throw new TypeError("无法确定变量的类型");
throw new RangeError("超过数字范围");
throw new EvalError("Eval执行失败");
throw new URIError("URL解析错误");
throw new ReferenceError("无法找到引用对象");
throw new Error("出现未知错误");
对于这些错误,都把自定义消息将存放到错误对象的 message 属性中。
在实际编程过程中,通常会涉及一些自定义检测。当检测不通过时,就会抛出错误。例如,以下代码声明了一个 discount() 函数,用于计算商品打折后的最终价格。
function discount(unitPrice: number, discountPercentage: number): number {
if (discountPercentage >= 0 && discountPercentage < 100) {
return unitPrice * (1 - discountPercentage / 100);
} else {
throw new RangeError("折扣率应介于0%~100%。");
}
}
try {
console.log("单价1000,当折扣率为30%时,最终价格为" + discount(1000, 30));
console.log("单价1000,当折扣率为500%时,最终价格为" + discount(1000, 500));
} catch (err) {
console.log(err.name + ":" + err.message);
}
discount() 具有两个参数,unitPrice 表示商品单价,discountPercentage 表示折扣率。其中,折扣率应该介于 0%~100%。如果折扣率范围有误,则抛出 RangeError 错误。
输出结果如下。
> 单价1000,当折扣率为30%时,最终价格为700
> RangeError:当折扣率应介于0%~100%。
自定义错误类型
除使用内置错误之外,还可以通过继承内置错误创建自定义错误类型。当创建自定义错误类型时,需要提供 name 属性和 message 属性,示例代码如下。
class CustomError extends Error {
constructor(message: string) {
super(message);
this.name = "CustomError";
this.message = message;
}
}
之后就可以在代码中使用自定义错误,示例代码如下。
try {
throw new CustomError("产生了自定义错误!");
}
catch (err: any) {
//以下代码输出true
console.log(err instanceof CustomError);
//以下代码输出CustomError: 产生了自定义错误!
console.log(`${err.name}: ${err.message}`);
}
自定义错误类型有助于在查错时精准区分错误产生的原因,提高查错效率。