EvalError
EvalError
EvalError 객체는 전역 eval() 함수에 관한 오류를 나타냅니다. 이 예외는 더 이상 JavaScript에서 던져지지 않지만, EvalError 객체는 호환성을 위해 남아 있습니다.
본문
EvalError 객체는 전역 eval() 함수에 관한 오류를 나타냅니다. 이 예외는 더 이상 JavaScript에서 던져지지 않지만, EvalError 객체는 호환성을 위해 남아 있습니다. EvalError는 직렬화 가능한 객체이므로 structuredClone()으로 복제하거나 postMessage()로 Worker 사이에서 복사할 수 있습니다. EvalError는 Error의 하위 클래스입니다.
생성자
EvalError()— 새EvalError객체를 만듭니다.
인스턴스 속성
부모 Error의 인스턴스 속성도 상속합니다. EvalError.prototype에 정의되어 모든 인스턴스가 공유하는 속성: constructor, name(오류 타입의 이름, 초기 값은 "EvalError").
인스턴스 메서드
부모 Error의 인스턴스 메서드를 상속합니다.
왜 아직 존재하는가 (역사적 배경)
초기 ECMAScript 사양에서는 전역 eval() 함수가 문자열을 코드로 평가하는 과정에서 문제를 발견하면 EvalError를 던질 것으로 정의되었습니다. 그러나 실제로는 모든 표준 호환 엔진이 eval()에서 SyntaxError를 던지도록 동작했고, EvalError는 사실상 사용되지 않게 되었습니다. 이후 사양에서는 EvalError를 "표준 내장 오류 타입" 목록에 유지하되 eval()이 EvalError를 던지지 않도록 명시했습니다. 이는 이미 EvalError를 참조하거나 검사하던 기존 코드(예: instanceof EvalError를 사용하던 코드)를 깨뜨리지 않기 위한 호환성 조치입니다.
따라서 오늘날 EvalError를 만나는 경우는 대부분 개발자가 직접 new EvalError(...)로 인스턴스를 만들어 던지는 경우입니다. 오류 처리 코드에서 예전 호환성을 위해 EvalError 분기를 유지하고 싶다면 다음과 같이 처리할 수 있습니다.
function customEval(code) {
try {
return eval(code);
} catch (e) {
// eval은 SyntaxError를 던짐. 호환성을 위해 EvalError로 감싸 전달
if (e instanceof SyntaxError) {
throw new EvalError(`Cannot evaluate: ${e.message}`, { cause: e });
}
throw e;
}
}
이때 원래 오류를 잃지 않도록 cause 옵션(두 번째 인자)으로 전달하고, 상위 try/catch에서 e instanceof EvalError로 다시 잡아낼 수 있습니다.
예제
EvalError 만들기 — new EvalError("Hello")로 직접 만들어 던질 수 있습니다. (현재 JavaScript는 eval() 실행에서 EvalError를 던지지 않으므로, 직접 던지는 예제가 대표적입니다.)
try {
throw new EvalError("Hello");
} catch (e) {
console.log(e instanceof EvalError); // true
console.log(e.message); // "Hello"
console.log(e.name); // "EvalError"
console.log(e.stack); // Stack of the error
}
더 알아보기
Error— 모든 오류 타입의 기본 클래스eval()— 문자열을 코드로 평가하는 전역 함수TypeError,RangeError,ReferenceError,SyntaxError,URIError— 기타 내장 오류 타입