--- title: Error slug: Web/JavaScript/Reference/Global_Objects/Error tags: - Error - JavaScript - Reference translation_of: Web/JavaScript/Reference/Global_Objects/Error ---
{{JSRef}}

Error 생성자는 오류 객체를 생성합니다. Error 객체의 인스턴스는 런타임 오류가 발생했을 때 던져집니다. Error 객체를 사용자 지정 예외의 기반 객체로 사용할 수도 있습니다.

구문

new Error([message[, fileName[, lineNumber]]])

매개변수

message {{optional_inline}}
사람이 읽을 수 있는, 오류에 대한 설명.
fileName {{optional_inline}} {{non-standard_inline}}
생성할 Error 객체의 fileName 속성 값. 기본값은 Error 생성자를 호출한 코드를 포함하고 있는 파일의 이름입니다.
lineNumber {{optional_inline}} {{non-standard_inline}}
생성할 Error 객체의 lineNumber 속성 값. 기본값은 Error 생성자 호출을 포함한 줄 번호입니다.

설명

런타임 오류는 새로운 Error 객체를 생성하고 던집니다.

이 페이지는 Error 오브젝트 자체와, 생성자 함수로서의 사용처를 다룹니다. Error 인스턴스가 상속하는 속성과 메서드는 {{jsxref("Error.prototype")}}을 참고하세요.

함수로 사용

Error를 {{jsxref("Operators/new", "new")}} 없이 함수로 사용하면 Error 객체를 반환합니다. 즉 Error를 직접 호출해도 인스턴스를 만드는 것과 동일한 결과를 얻을 수 있습니다.

// 이렇게 호출하는 것과
const x = Error('I was created using a function call!');
​​​​// 이렇게 사용하는게 동일
const y = new Error('I was constructed via the "new" keyword!');

오류 유형

JavaScript에는 일반적인 Error 생성자 외에도 7개의 중요 오류 생성자가 존재합니다. 클라이언트측 예외에 대해서는 제어 흐름과 에러 처리를 참고하세요.

{{jsxref("EvalError")}}
전역 함수 {{jsxref("eval", "eval()")}}에서 발생하는 오류의 인스턴스를 생성합니다.
{{jsxref("InternalError")}} {{non-standard_inline}}
JavaScript 엔진의 내부에서 오류가 발생했음을 나타내는 오류 인스턴스를 생성합니다.
{{jsxref("RangeError")}}
숫자 변수나 매개변수가 유효한 범위를 벗어났음을 나타내는 오류 인스턴스를 생성합니다.
{{jsxref("ReferenceError")}}
잘못된 참조를 했음을 나타내는 오류 인스턴스를 생성합니다.
{{jsxref("SyntaxError")}}
{{jsxref("eval", "eval()")}}이 코드를 분석하는 중 잘못된 구문을 만났음을 나타내는 오류 인스턴스를 생성합니다.
{{jsxref("TypeError")}}
변수나 매개변수가 유효한 자료형이 아님을 나타내는 오류 인스턴스를 생성합니다.
{{jsxref("URIError")}}
{{jsxref("encodeURI", "encodeURI()")}}나 {{jsxref("decodeURI", "decodeURl()")}} 함수에 부적절한 매개변수를 제공했을 때 발생하는 오류의 인스턴스를 생성합니다.

속성

{{jsxref("Error.prototype")}}
Error 인스턴스에 속성을 추가할 수 있습니다.

메서드

전역 Error 객체는 자신의 메서드를 가지지 않습니다. 그러나 프로토타입 체인을 통해 일부 메서드를 상속받습니다.

Error 인스턴스

{{page('ko/docs/Web/JavaScript/Reference/Global_Objects/Error/prototype', '설명')}}

속성

{{page('ko/docs/Web/JavaScript/Reference/Global_Objects/Error/prototype', '속성')}}

메서드

{{page('ko/docs/Web/JavaScript/Reference/Global_Objects/Error/prototype', '메서드')}}

예제

일반적인 오류 던지기

Error 객체를 생성한 후엔 대개 {{jsxref("Statements/throw", "throw")}} 키워드를 이용해 던집니다. {{jsxref("Statements/try...catch", "try...catch")}} 구문을 이용하여 오류를 처리할 수 있습니다.

try {
  throw new Error("이런!");
} catch (e) {
  alert(e.name + ": " + e.message);
}

특정 오류 처리하기

this should probably be removed오류의 {{jsxref("Object.prototype.constructor", "constructor")}} 속성을 판별해 특정 오류에 대해서만 처리를 할 수 있습니다. 현대적인 JavaScript 엔진의 코드를 작성한다면 {{jsxref("Operators/instanceof", "instanceof")}} 키워드를 이용할 수도 있습니다.

try {
  foo.bar();
} catch (e) {
  if (e instanceof EvalError) {
    alert(e.name + ": " + e.message);
  } else if (e instanceof RangeError) {
    alert(e.name + ": " + e.message);
  }
  // ... etc
}

사용자 정의 에러 타입

throw new MyError() 이후 instanceof MyError로 직접 만든 오류를 판별할 수 있도록 Error의 파생 오류 정의를 고려해보세요. 더 깔끔하고 일관적인 오류 처리 코드를 작성할 수 있습니다. StackOverflow의 "What's a good way to extend Error in JavaScript?"를 방문해 심도 있는 논의를 읽어보세요.

ES6 사용자 정의 오류 클래스

Babel 버전 7 미만으로 사용자 정의 오류 클래스를 처리하려면 {{jsxref("Object.defineProperty()")}} 메서드를 사용해 정의해야만 합니다. 그렇지 않으면 오래된 Babel 및 다른 트랜스파일러가 추가 설정 없이 코드를 처리할 수 없습니다.

ES2015 클래스를 사용할 때, 일부 브라우저는 CustomError 생성자를 스택 트레이스에 포함합니다.

class CustomError extends Error {
  constructor(foo = 'bar', ...params) {
    // Pass remaining arguments (including vendor specific ones) to parent constructor
    super(...params);

    // Maintains proper stack trace for where our error was thrown (only available on V8)
    if (Error.captureStackTrace) {
      Error.captureStackTrace(this, CustomError);
    }

    // Custom debugging information
    this.foo = foo;
    this.date = new Date();
  }
}

try {
  throw new CustomError('baz', 'bazMessage');
} catch(e){
  console.log(e.foo); //baz
  console.log(e.message); //bazMessage
  console.log(e.stack); //stacktrace
}

ES5 사용자 정의 오류 객체

프로토타입 선언을 사용하면 모든 브라우저가 CustomError 생성자를 스택 트레이스에 포함합니다.

function CustomError(foo, message, fileName, lineNumber) {
  var instance = new Error(message, fileName, lineNumber);
  instance.foo = foo;
  Object.setPrototypeOf(instance, Object.getPrototypeOf(this));
  if (Error.captureStackTrace) {
    Error.captureStackTrace(instance, CustomError);
  }
  return instance;
}

CustomError.prototype = Object.create(Error.prototype, {
  constructor: {
    value: Error,
    enumerable: false,
    writable: true,
    configurable: true
  }
});

if (Object.setPrototypeOf){
  Object.setPrototypeOf(CustomError, Error);
} else {
  CustomError.__proto__ = Error;
}


try {
  throw new CustomError('baz', 'bazMessage');
} catch(e){
  console.log(e.foo); //baz
  console.log(e.message) ;//bazMessage
}

명세

Specification Status Comment
{{SpecName('ES1')}} {{Spec2('ES1')}} Initial definition. Implemented in JavaScript 1.1.
{{SpecName('ES5.1', '#sec-15.11', 'Error')}} {{Spec2('ES5.1')}}  
{{SpecName('ES2015', '#sec-error-objects', 'Error')}} {{Spec2('ES2015')}}  
{{SpecName('ESDraft', '#sec-error-objects', 'Error')}} {{Spec2('ESDraft')}}  

브라우저 호환성

{{Compat("javascript.builtins.Error")}}

같이 보기