throw expressions S2
- Stage: Stage 2
- Status: Active
- ECMAScript edition: —
- Synchronized: Aug 28, 2026
- 中文译文 · Source repository
This proposal introduces a throw expression to allow throwing exceptions in expression contexts like parameter initializers, arrow functions, and conditionals. It differs from the throw statement in precedence, hence forbidding certain binary operators to its right unless parenthesized.
The README below comes from the upstream repository and may contain outdated stage or status metadata. Use the proposal details above as the current source of truth.
ECMAScript throw expressions
This proposal defines new syntax to throw exceptions from within an expression context.
Status
Stage: 2
Champion: Ron Buckton (@rbuckton)
For more information see the TC39 proposal process.
Authors
- Ron Buckton (@rbuckton)
Proposal
A throw expression allows you to throw exceptions in expression contexts. For example:
- Parameter initializers
- Arrow function bodies
- Conditional expressions
- Logical operations
A throw expression does not replace a throw statement due to the difference
in the precedence of their values. To maintain the precedence of the throw statement,
we must add a lookahead restriction to ExpressionStatement to avoid ambiguity.
Due to the difference in precedence between a throw expression and a ThrowStatement, certain operators to the right
of the expression would parse differently between the two which could cause ambiguity and confusion:
As a result, all binary operators and the ? operator are forbidden to the right of a throw expression. To use these
operators inside of a throw expression, the expression must be surrounded with parentheses:
However, we do not forbid : so that a throw expression can still be easily used in a ternary:
Grammar
Other Notes
A throw expression can be approximated in ECMAScript using something like the following definition:
However, this has several downsides compared to a native implementation:
- The
__throwhelper will appear inerr.stackin a host environment.- This can be mitigated in some hosts that have
Error.captureStackTrace
- This can be mitigated in some hosts that have
- Hosts require more information for optimization/deoptimization decisions as the
throwis not local to the function. - Not ergonomic for debugging as the frame where the exception is raised is inside of the helper.
- Inline invoked arrow not ergonomic (at least 10 more symbols compared to native).
Resources
TODO
The following is a high-level list of tasks to progress through each stage of the TC39 proposal process:
Stage 1 Entrance Criteria
- Identified a "champion" who will advance the addition.
- Prose outlining the problem or need and the general shape of a solution.
- Illustrative examples of usage.
-
High-level API(proposal does not introduce an API).
Stage 2 Entrance Criteria
- Initial specification text.
- Optional. Transpiler support.
Stage 3 Entrance Criteria
- Complete specification text.
- Designated reviewers have signed off on the current spec text.
- The ECMAScript editor has signed off on the current spec text.
Stage 4 Entrance Criteria
- Test262 acceptance tests have been written for mainline usage scenarios and merged.
- Two compatible implementations which pass the acceptance tests: [1], [2].
- A pull request has been sent to tc39/ecma262 with the integrated spec text.
- The ECMAScript editor has signed off on the pull request.