You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中throw抛出异常无法终止程序执行如何解决

问题根因

异常没有终止程序的核心原因是错误被内部try/catch吞掉,没有向外层传递:

  • #validatePhone方法内抛出的"Invalid phone number!"错误,直接被同方法内的catch块捕获,仅打印了日志,没有继续向外抛出
  • catch块执行完成后,方法默认返回undefined赋值给this.#phone,构造函数正常执行完毕,Customer实例成功创建,后续的借书逻辑自然会继续运行
  • 测试传入的手机号(99) 9999-99999末尾多1位,不符合正则匹配规则,刚好触发了校验失败的逻辑。
修复步骤

1. 不要在校验方法内部吞掉异常

要么移除方法内多余的try/catch,让校验失败的错误直接向外冒泡;要么在catch块打印完日志后重新抛出错误,保证外层能感知到校验失败。
修正后的校验方法代码:

#validatePhone(phone) {
    const pattern = /(\(?[0-9]{2}\)?)\s?([0-9]{5})-?([0-9]{4})/;
    if (!pattern.test(phone)) {
        const err = new Error('Invalid phone number!');
        console.log(chalk.red(err.message));
        throw err;
    }
    return phone;
}

如果要保留内部try/catch结构,必须在catch中重新抛错:

#validatePhone(phone) {
    try {
        const pattern = /(\(?[0-9]{2}\)?)\s?([0-9]{5})-?([0-9]{4})/;
        if(!pattern.test(phone)) throw new Error('Invalid phone number!');
        return phone;
    } catch(err) {
        console.log(chalk.red(err.message));
        // 关键:处理完日志后重新抛出错误,阻断后续流程
        throw err;
    }
}

2. 外层捕获实例创建时的错误,终止无效流程

Customer实例创建失败时,直接终止程序,不要执行后续借书逻辑:

// Index 入口文件代码
import chalk from 'chalk';
import { Customer } from './Customer.js';

try {
    // 校验不通过时,构造函数抛出错误,直接跳转到外层catch
    const customer = new Customer('John Doe', '20-04-04', 'r@r.com', '(99) 9999-99999');
    // 仅当客户信息校验通过、实例创建成功时,才执行借书逻辑
    customer.rentBoook('O Ar', 7)
        .then(r => console.log(chalk.green('Book rented with success!')))
        .catch(err => console.log(chalk.red(err)));
} catch (err) {
    console.log(chalk.red('客户信息校验失败,程序终止'));
    process.exit(1);
}
额外优化点
  • 当前phone属性的setter直接给私有属性赋值,没有走校验逻辑,后续通过customer.phone = 'xxx'修改手机号时会绕过规则,建议setter内也调用#validatePhone做校验后再赋值
  • 抛出错误时统一使用new Error(错误信息)格式,不要直接抛字符串,方便后续统一错误处理、追踪错误栈
  • 修复后手机号校验失败时,程序会直接终止,不会再出现打印手机号格式错误后仍提示借书成功的问题。

内容的提问来源于stack exchange,提问作者Rafael Prado

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 19:42:25