NATIVE

settings_applicationsObject

NATIVE

Editing
  • account_tree
  • bug_report

ObjectError

코드 실행시 에러를 다루는 객체이다. 하위 클래스로 다양한 에러 객체가 존재한다.

설명

코드 오류와 Error 객체

Error() 생성자 함수는 일반적으로 Error 객체의 인스턴스를 "반환한다"가 아닌 "던진다(throw)"는 개념을 사용한다. 이것은 Error 객체의 인스턴스가 사용되는 목적이 다른 일반 객체와는 다르기 때문이다. 대부분의 오류는 개발 과정 상에서 발생한다. 그리고 이 오류들은 친절하게도 웹브라우저의 개발자 도구 중의 하나인 개발자 콘솔(console)에서 명확하게 알 수 있다. 사실 Error 객체가 특별히 어떠한 역할을 수행할 일이 있어 보이지 않는다. 그냥 보기 싫은 객체인 것이다.

프로젝트의 규모와 구현 복잡도에 따라 다르겠지만 오류가 발생할 수 있는 원인과 범위는 매우 다양하며 광범위하다.  그래서 프로그램의 모든 오류를 개발 과정 상에서 다 잡아내기는 사실상 어려운 일이다. 기본적으로 내장된 오류는 대부분 개발 과정에서 발생하기에 개발만 완벽하게 마친다면 더 이상의 오류는 없을 것이라는 확신을 하기 마련인데 하지만 오류는 언제든지 발생할 수 있다는 생각이 필요하다. 그리고 최종 제품 출시시 가변적인 환경에서 오류가 발생할 수 있을 것이라 예측된다면 오류에 적극적으로 대처하는 코드를 삽입해야 한다. 출시 후 발생하는 오류는 개발 과정에서 미처 알지 못한 내장된 표준 오류일 수 있고 불안정한 코드로 인한 처리 오류일 수도 있다. 출시 전과 출시 후의 오류에 대처하는 방식이 확연히 다르다. 당연히 출시 후가 더 까다롭다는 것이다.  Error 객체는 출시 후 발생하는 오류에 대처하게 하는 선물같은 객체이다.

Error 객체의 throw

이제 Error 객체가 왜 다른 객체와 달리 반환이 아닌 던진다(throw)는 개념을 사용하는지에 대해 알아보자. 앞서 이야기했듯이 제품 출시 후 가변적인 환경으로 인해 표준 오류가 발생할 수도 있는 코드 구간을 예측(또는 보수)해야 한다. 그리고 표준 오류가 아닌 절차 또는 결과에 영향을 미치는 오류가 발생할 수도 있다. 역시 그러한 코드 구간을 예측(또는 보수)해야 한다. 오류가 발생하면 더 이상 동일한 오류가 발생하지 않도록 수정하는 게 기본이지만 계속 오류가 발생할 수 있는 가변적인 환경이라 판단되면 오류를 직접 관리해야 한다. 이때 Error 객체의 역할이 드러나는 데 처음에 Error() 생성자 함수는 반환이 아닌 던진다(throw)는 개념을 사용한다고 했다. 당연히 던지면 누군가 받아야 하지 않을까? 바로 그 역할을 하는 아주 중요한 구문이 있다. 바로  try...catch라는 구문이다. try 블럭에 오류가 발생할 수 있는 코드를 포함하면 실제로 오류가 발생할 때 시스템은 발생한 오류에 관한 Error 객체를 생성해 catch 블럭으로 던진다. 만일 표준 오류가 아닌 직접적으로 정의한 오류를 던지고자 한다면 명시적으로 Error 객체를 생성해 던질 수도 있다. 던져진 Error 객체에는 오류에 관한 정보를 가지고 있는 프로퍼티가 있으므로 catch 블럭에서는 던져진 Error 객체를 받아 적절한 조치를 하면 된다.

게으른 개발자에게는 Error 객체를 변방의 존재로 취급하겠지만 견고한 코드를 짜는 데 있어서 대단히 중요한 객체이다. 구지 없어도 되는 코드라 생각하지 말고 적극적으로 try...catch 구문을 생성해서 시스템이 내뱉는 Error 객체를 활용해야 한다.

만약에 try...catch 구문없이 Error 객체를 던지면(throw) 웹브라우저의 개발자 콘솔(console)에 전송된다.

Error 객체와 try...catch 구문이 주는 장점

일반적으로 ECMAScript는 특정 라인에서 내부 표준 오류가 발생하면 그 라인 이후부터 실행되지 않고 중단한다. 웹브라우저의 개발자 콘솔에 빨간색의 오류 메시지를 내보내고는 묵묵답답 멈춰 버린다. try...catch 구문을 사용한다는 것은 오류를 직접 관리하겠다는 선언과 같다. 따라서 시스템은 try 블럭 내의 코드에서 내부 표준 오류가 발생하면 catch 블럭으로 Error 객체를 넘기고 try 블럭 내의 코드만 실행을 중지한다. 그리고 try 블럭 바깥쪽 이후 코드를 계속 실행한다. 만일 try 블럭내의 코드가 try 블럭 바깥쪽 이후 코드와 독립적이라면 특정 처리만 중단하기 때문에 사용자 경험을 좋게 할 수 있다. 물른 catch 블럭에서 오류에 대한 적절한 처리를 하지 않으면 안된다.

예제

(1) try...catch 구문을 사용하는 경우

num은 선언되지 않았으므로 ReferenceError가 발생했다. 그리고 try 블럭 바깥쪽 이후 코드인 'third output.' 출력이 정상적으로 실행이 되었다.

(2) try...catch 구문이 없는 경우

'first output.' 출력은 성공적으로 실행했지만 이후 코드에서 num 변수가 선언되지 않았으므로 ReferenceError가 발생했다. 그리고 이후 코드를 실행하지 않고 멈춰 버린다.

하위 트리 탐색

  • Constructor

    사용자 지정 오류를 나타내는 Error 객체를 Error() 생성자 함수로 생성하여 던질수 있다. 명시적으로 생성하지 않아도 try...catch 구문에서 표준 오류가 발생시 Error 객체의 인스턴스가 자동으로 생성되어 던져진다.

    • Error()

      Error 객체를 생성하는 생성자 함수이다. 명시적으로 생성되는 것만 아니라 런타임(runtime) 오류가 발생했을 때 시스템에 의해 생성(throw)되기도 한다.

  • [[Prototype]]

    • Properties

      • cause

        발생한 오류의 구체적인 원인을 나타낸다.

      • columnNumber

        오류가 발생한 파일의 행의 열 번호를 조회한다.

      • lineNumber

        오류가 발생한 파일의 행 번호를 조회한다.

      • message

        발생한 오류에 대한 설명을 조회한다.

      • name

        발생한 오류 유형의 이름을 조회한다.

      • stack

        오류가 발생한 지점에서 역으로 추적하여 관련 파일, 관련 함수, 관련 행, 사용 인수 등에 대한 정보를 제공한다.

      • fileName

        오류가 발생한 파일의 경로를 조회한다.

    • Methods

      • toString()

        Error 객체를 나타내는 문자열을 반환한다.

버전 명세

ECMAScript 2024(15th Edition)
#sec-error-objects

지원 웹브라우저