如何捕获“私有字段必须在封闭类中声明”错误
问题成因
你代码里的catch块无法触发,核心原因是访问不存在于类声明中的私有字段属于JS的早期语法错误,错误发生在代码解析阶段,根本不会进入运行时执行流程,自然无法被运行时的try/catch捕获。
具体规则可以拆解为两点:
- 私有标识符的作用域是严格绑定在声明它的类内部的,引擎在解析类的代码时,会先扫描所有类内声明的私有字段。如果在类作用域内出现了未声明过的私有标识符(比如你代码里的
#age,Person类只声明了#name,从未声明过#age),引擎会直接在解析阶段抛出语法错误,整个脚本都不会开始执行,你写的try/catch逻辑连运行的机会都没有。 - 只有当类内确实声明了对应私有字段,只是传入的访问对象不是该类的实例、没有绑定对应私有字段时,错误才会在代码运行到访问语句的那一刻抛出,这种运行时错误才能被try/catch正常捕获。
举个能让catch正常触发的对比示例:
class Person { #name = "Jack"; #age = 25; // 先在类内声明#age私有字段 static hasTitle(obj) { try { // 传入非Person实例时,这里才会抛运行时错误,可被catch捕获 console.log(obj.#age); } catch (error) { console.log(Object.keys(error)); } return #name in obj; } } const p = new Person(); console.log(Person.hasTitle(p));
内容的提问来源于stack exchange,提问作者Omar Dulaimi
相关产品推荐
相关产品推荐

