Синтаксис оператора try
TryStatement [Yield, Await, Return] :
try Block [?Yield, ?Await, ?Return] Catch [?Yield, ?Await, ?Return]
try Block [?Yield, ?Await, ?Return] Finally [?Yield, ?Await, ?Return]
try Block [?Yield, ?Await, ?Return] Catch [?Yield, ?Await, ?Return] Finally [?Yield, ?Await, ?Return]
Catch [Yield, Await, Return] :
catch ( CatchParameter [?Yield, ?Await] ) Block [?Yield, ?Await, ?Return]
catch Block [?Yield, ?Await, ?Return]
Finally [Yield, Await, Return] :
finally Block [?Yield, ?Await, ?Return]
CatchParameter [Yield, Await] :
BindingIdentifier [?Yield, ?Await]
BindingPattern [?Yield, ?Await]
Оператор try включает в себя блок кода, в котором может возникнуть исключительное условие, например ошибка времени выполнения или оператор throw. Предложение catch предоставляет код обработки исключений. Когда предложение catch перехватывает исключение, его CatchParameter привязывается к этому исключению.
14.15.1 Статическая семантика: Ранние Ошибки
Catch : catch ( CatchParameter ) Block
- Это синтаксическая ошибка, если BoundNames из CatchParameter содержит какие-либо повторяющиеся элементы.
- Это синтаксическая ошибка, если какой-либо элемент BoundNames из CatchParameter также встречается в LexicallyDeclaredNames из Block.
- Это синтаксическая ошибка, если какой-либо элемент BoundNames из CatchParameter также встречается в VarDeclaredNames из Block.
Альтернативная статическая семантика для этой продукции приведена в приложении B.3.4.
14.15.2 Семантика времени выполнения: CatchClauseEvaluation
С параметром брошенного значения thrownValue.
Catch : catch ( CatchParameter ) Block
1. Пусть oldEnv будет LexicalEnvironment текущего контекста выполнения. 2. Пусть catchEnv будет NewDeclarativeEnvironment(oldEnv). 3. Для каждого элемента argName из BoundNames параметра CatchParameter выполните а. Выполнять ! catchEnv.CreateMutableBinding(argName, false). 4. Задайте для LexicalEnvironment текущего контекста выполнения значение catchEnv. 5. Пусть status будет BindingInitialization из CatchParameter с аргументами thrownValue и catchEnv. 6. Если status - внезапное завершение, то а. Установите для LexicalEnvironment текущего контекста выполнения значение oldEnv. b. Верните Завершение Completion(status). 7. Пусть B будет результатом вычисления блока. 8. Установите LexicalEnvironment текущего контекста выполнения на oldEnv. 9. Верните завершение (B).
1. Верните результат оценки Block.
Независимо от того, как контроль покидает Block, LexicalEnvironment всегда возвращается в свое прежнее состояние.
14.15.3 Семантика времени выполнения: Оценка
TryStatement : try Block Catch
1. Пусть B будет результатом оценки Block. 2. Если B.[[Type]] является throw, пусть C будет CatchClauseEvaluation для Catch с аргументом B.[[Value]]. 3. Иначе, пусть C будет B. 4. Вернуть Завершение Completion(UpdateEmpty(C, undefined)).
TryStatement : try Block Finally
1. Пусть B будет результатом оценки Block. 2. Пусть F будет результатом вычисления Finally. 3. Если F.[[Type]] является normal, установите F на B. 4. Вернуть Завершение Completion(UpdateEmpty(F, undefined)).
TryStatement : try Block Catch Finally
1. Пусть B будет результатом оценки Block. 2. Если B.[[Type]] является throw, пусть C будет CatchClauseEvaluation для Catch с аргументом B.[[Value]]. 3. Иначе, пусть C будет B. 4. Пусть F будет результатом вычисления Finally. 5. Если F.[[Type]] является normal, установите F на C. 6. Вернуть Завершение Completion(UpdateEmpty(F, undefined)).
Информационные ссылки
Стандарт ECMAScript — Раздел «14.15 The try Statement» — https://tc39.es/ecma262/#sec-try-statement