TypeScript中throw(e)与throw e是否存在语义差异?
Are
throw(e) and throw e Semantically Identical in TypeScript? 放心,在 TypeScript(以及它编译生成的 JavaScript)里,throw(e) 和 throw e 语义完全一致,完全不会出现像你提到的 C# 里那种破坏调用栈的情况,你可以放心使用任意一种写法。
为什么两者没有区别?
JavaScript 中的 throw 是一个语句,它后面需要跟一个表达式来指定要抛出的值。这里的括号仅仅是用来包裹表达式的分组运算符——它不会改变表达式本身的求值结果,也不会影响 throw 语句的执行逻辑。不管加不加括号,抛出的都是同一个错误对象,自然也会完整保留原始的调用栈信息。
你的测试代码验证了这一点
你自己写的测试代码已经能很好地证明这一点,两种写法都会输出带有完整调用栈的错误:
// 写法1:直接 throw e try { throw new Error("You can't recover from this."); } catch (e) { console.error(e); throw e; } // 写法2:带括号的 throw(e) try { throw new Error("You can't recover from this."); } catch (e) { console.error(e); throw(e); }
和 C# 的区别在哪里?
C# 里的 throw(e) 和无括号的 throw 行为不同,是因为 C# 语言本身的设计:throw(e) 相当于重新抛出一个新的异常实例(会把当前代码位置作为调用栈的起点),而不带括号的 throw 则是重新抛出捕获到的原始异常,保留其原始调用栈。但这套规则完全不适用于 TypeScript/JavaScript,两者的语法和异常处理机制是独立设计的。
总结一下:在 TypeScript 中,这两种写法没有任何功能上的差异,选哪种完全取决于你的代码风格偏好,不用顾虑调用栈的问题。
内容的提问来源于stack exchange,提问作者Michael Schnerring
相关产品推荐
相关产品推荐

