17 오류 처리 및 언어 확장

구현체는 관련된 ECMAScript 언어 구성요소가 평가될 때 대부분의 오류를 보고해야 한다. An 조기 오류는 오류를 포함하는 Script의 어떤 구성도 평가되기 전에 감지되어 보고될 수 있는 오류이다. 조기 오류의 존재는 해당 구성의 평가를 방지한다. 구현체는 ParseScript에서 해당 Script를 파싱하는 과정의 일부로 Script에 있는 조기 오류를 보고해야 한다. Module조기 오류Module이 평가되는 시점에 보고되며 그 Module은 초기화되지 않는다. eval 코드의 조기 오류eval이 호출될 때 보고되며 eval 코드의 평가를 방지한다. 조기 오류가 아닌 모든 오류는 런타임 오류이다.

구현체는 본 명세서의 “Static Semantics: Early Errors” 하위절에 열거된 상태가 발생하면 이를 조기 오류로 보고해야 한다.

컴파일러가 어떤 구성체가 어떤 상황에서도 오류 없이 실행될 수 없음을 증명할 수 있더라도, 구현체는 다른 종류의 오류를 조기 오류로 취급해서는 안 된다. 구현체는 그러한 경우에 조기 경고를 발행할 수는 있지만, 관련 구성체가 실제로 실행될 때까지 오류를 보고해서는 안 된다.

구현체는 명시된 대로 모든 오류를 보고해야 하며, 다음의 경우는 예외이다:

17.1 금지된 확장

구현체는 다음 방식으로 이 명세를 확장해서는 안 된다:

  • strict 모드 코드에서 구문 생성자를 사용하여 정의된 ECMAScript 함수 객체는 "caller" 또는 "arguments"라는 이름의 자체 소유 속성을 갖고 생성되어서는 안 된다. 이러한 자체 소유 속성은 ArrowFunction, MethodDefinition, GeneratorDeclaration, GeneratorExpression, AsyncGeneratorDeclaration, AsyncGeneratorExpression, ClassDeclaration, ClassExpression, AsyncFunctionDeclaration, AsyncFunctionExpression 또는 AsyncArrowFunction을 사용하여 정의된 함수 객체에도 생성되어서는 안 되며, 정의가 strict 모드 코드에 포함되어 있는지 여부와 관계없이 해당된다. 내장 함수, Function 생성자를 사용하여 생성된 strict 함수, Generator 생성자를 사용하여 생성된 제너레이터 함수, AsyncFunction 생성자를 사용하여 생성된 async 함수, 그리고 bind 메서드를 사용하여 생성된 함수 또한 이러한 자체 소유 속성으로 생성되어서는 안 된다.
  • 구현체가 어떤 함수 객체에 "caller"라는 이름의 자체 소유 속성을 확장하면, 그 속성의 값은 [[Get]] 또는 [[GetOwnProperty]]를 통해 관찰될 때 strict 함수 객체가 되어서는 안 된다. 만약 그것이 접근자 속성이라면, 그 속성의 [[Get]] 속성값인 함수는 호출될 때 결코 strict 함수를 반환해서는 안 된다.
  • 매핑된 arguments 객체이건 매핑되지 않은 arguments 객체이건 "caller"라는 이름의 자체 소유 속성을 가진 객체로 생성되어서는 안 된다.
  • toLocaleString과 같이 ECMA-402에 명시된 내장 메서드의 동작은 ECMA-402에서 명시한 경우를 제외하고 확장되어서는 안 된다.
  • 22.2.1B.1.2에 있는 RegExp 패턴 문법은 [UnicodeMode] 문법 매개변수가 존재할 때 소스 문자 A-Z 또는 a-z 중 어느 것도 IdentityEscape[+UnicodeMode]로 인식하도록 확장되어서는 안 된다.
  • Syntactic Grammar는 BindingIdentifier 비단말 기호와 매치되는 소스 텍스트 바로 뒤에 토큰 :가 즉시 올 수 있도록 허용하는 어떤 방식으로도 확장되어서는 안 된다.
  • strict 모드 코드를 처리할 때, 구현체는 12.9.3.1조기 오류 규칙을 완화해서는 안 된다.
  • TemplateEscapeSequence12.9.4에 정의된 LegacyOctalEscapeSequence 또는 NonOctalDecimalEscapeSequence를 포함하도록 확장되어서는 안 된다.
  • strict 모드 코드를 처리할 때, B.3.1, B.3.2, B.3.3, 및 B.3.5에 정의된 확장은 지원되어서는 안 된다.
  • Module 목표 기호로 파싱할 때, B.1.1에 정의된 렉시컬 문법 확장은 지원되어서는 안 된다.
  • ImportCall은 확장되어서는 안 된다.