프로그램 개발서

JavaScript Error.isError()로 다른 실행 환경의 오류 객체 판별하기 본문

Javascript

JavaScript Error.isError()로 다른 실행 환경의 오류 객체 판별하기

rairen 2026. 8. 7. 20:11

문제와 사용 상황

typeof error === "error"는 동작하지 않고 instanceof Error는 iframe, worker, Node.js vm처럼 다른 realm에서 만들어진 오류에 false가 될 수 있습니다. Error.isError()는 실제 Error 계열을 Boolean으로 판별하는 정적 메서드입니다.

테스트 환경·버전·날짜

2026-08-07 KST에 Node.js v24.14.0에서 node:vm cross-realm 오류와 일반 객체·null·문자열을 검사했습니다. Node.js v23.11.1에서는 API 미지원 상태를 확인해 기능 감지 경로만 기록했습니다.

최소 재현 코드

const nativeError = new Error("database timeout");
console.log(Error.isError(nativeError)); // true
console.log(Error.isError({
  name: "Error",
  message: "looks like an error"
})); // false
import vm from "node:vm";

const otherRealmError = vm.runInNewContext(
  "new Error('created elsewhere')"
);

console.log(otherRealmError instanceof Error); // false
console.log(Error.isError(otherRealmError));   // true

테스트 케이스와 결과

케이스 실제 출력 결과
API 지원 function 통과
현재 realm Error true 통과
cross-realm Error true 통과
TypeError true 통과
일반 객체·null·문자열 false 통과

Node.js v23.11.1에서는 typeof Error.isErrorundefined였으므로 기능 감지 후 대체 경로를 선택했습니다.

최종 코드

export function isErrorValue(value) {
  if (typeof Error.isError === "function") {
    return Error.isError(value);
  }

  // 구형 런타임의 제한된 대체 경로
  return value instanceof Error;
}

export function normalizeError(value) {
  if (!isErrorValue(value)) {
    return { kind: "non-error", message: "오류 객체가 아닌 값" };
  }
  return { kind: "error", name: value.name, message: value.message };
}

실패 조건·브라우저·버전 차이

  • 지원하지 않는 런타임에서 직접 호출하면 TypeError가 발생합니다.
  • instanceof Error는 다른 realm의 오류에서 false가 될 수 있습니다.
  • name·message만 검사하는 duck typing은 일반 객체를 잘못 통과시킬 수 있습니다.
  • Node.js v24.14.0은 지원했고 v23.11.1은 지원하지 않았습니다. 다른 브라우저 결과는 별도 확인이 필요합니다.

보안·호환성 주의사항

message, stack, cause에는 파일 경로와 사용자 입력이 포함될 수 있습니다. Error.isError()가 true여도 외부 응답에 상세 오류를 그대로 보내지 말고 일반화된 오류 코드와 제한된 로그를 사용하세요. 구형 런타임은 기능 감지 후 검토된 폴리필이나 제한된 대체 경로를 선택합니다.

직접 확인 방법

  1. typeof Error.isError를 실행합니다.
  2. 현재 realm Error, TypeError, null, 문자열, Error 모양의 일반 객체를 넣습니다.
  3. 브라우저 iframe·worker 또는 Node.js node:vm에서 만든 Error를 확인합니다.
  4. 미지원 런타임에서 대체 함수와 로그·응답 경계를 확인합니다.

공식 참고자료

반응형