ECMAScript | Оператор try

Синтаксис оператора 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(argNamefalse).
4. Задайте для LexicalEnvironment текущего контекста выполнения значение catchEnv.
5. Пусть status будет BindingInitialization из CatchParameter с аргументами thrownValue и catchEnv.
6. Если status - внезапное завершение, то
  а. Установите для LexicalEnvironment текущего контекста выполнения значение oldEnv.
  b. Верните Завершение Completion(status).
7. Пусть B будет результатом вычисления блока.
8. Установите LexicalEnvironment текущего контекста выполнения на oldEnv.
9. Верните завершение (B).

Catch : catch Block

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

Поделись записью