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
相关产品推荐
相关产品推荐

