自定义错误

在 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}`);
}

自定义错误类型有助于在查错时精准区分错误产生的原因,提高查错效率。