IT_Programming/JavaScript

자바스크립트 완벽가이드 - 6.16 throw

JJun ™ 2010. 7. 4. 20:47


'예외'란 무언가 예외적인 상황이나 에러가 발생했음을 가리키는 신호이다. 예외를 '발생시키다(throw)'라는 것은 그런 에러나 예외 상황을 알린다는 뜻이다. 한편 예외를 '잡아내다(catch)'라는 것은 그것을 처리한다는 뜻이다(즉 그 예외에서 회복하기 위해 무언가 필요하거나 적절한 행동을 취한다는 뜻이다). 자바스크립트에서는 런타임 에러가 일어날 때마다 예외를 발생시킨다. 또한 프로그램에서 throw 문을 사용하여 명시적으로

예외를 발생시킬 때에도 마찬가지로 예외를 발생시킨다. 예외를 잡아내는 데에는 다음 절에서 설명하는 try/catch/finally 문을 사용한다.[각주:1]


throw 문의 문법은 다음과 같다.

throw 표현식;

'표현식'의 결과값 타입은 무엇이든 될 수 있다. 하지만 대부분 그 타입은 Error객체 또는 Error의 하위 클래스 중 하나의 인스턴스가 되곤 한다. 때로는 에러 메시지를 담고 있는 문자열이나 어떤 에러 코드를 나타내는 숫자 값도 유용할 수 있다. 다음의 샘플 코드에서 예외를 발생시키는데 throw 문이 어떻게 쓰이는지 살펴보자.
function factorial(x) {
// 만약 입력 전달인자가 유효하지 않으면 예외를 발생시킨다!
if (x < 0) throw new Error("x must not be negative");
// 유효하다면 값을 계산하여 정상적으로 반환한다.
for(var f = 1; x > 1; f *= x, x--) /* 비어있음 */ ;
return f;
}


예외가 발생하면 자바스크립트 인터프리터는 정상적인 프로그램 실행을 즉시 중단하고 가장 가까운 예외 처리기로 넘어간다. 예외 처리기는 다음 절에서 설명할 try/catch/finally 문 중에서 catch 절을 사용하여 작성된다. 예외를 발생시켰던 코드 블로이 catch 절과 연결되어 있지 않으면, 인터프리터는 바로 상위 단계를 감싸고 있는 코드 블록에 예외 처리기가 연결되어 있는지 확인한다. 처리기를 찾을때까지 이 과정이 반복된다. 만일 예외를 처리할 try/catch/finaly 문이 없는 함수안에서 예외가 발생했다면 해당 함수를 호출했던 블록으로 그 예외가 전파되어 올라간다. 이 같은 방법으로 자바스크립트의 언어적인 구조를 따럿, 즉 호출 스택(call stack)을 따라서 예외가 전파되어 올라간다. 그래도 아무런 예외 처리기도 찾을 수 없으면 이 예외는 에러로 취급되어 사용자에게 보고된다.


throw 문은 ECMAScript v3에서 표준화되고 자바스크립트 1.4에서 구현되었다. Error 클래스와 그 하위 클래스들 역시 ECMAScript v3의 일부이지만 자바스크립트 1.5까지는 구현되지 않았다.

  1. 자바스크립트의 throw, try/catch/finally 문은 C++와 자바의 대응되는 문장들과 비슷하지만 완전히 똑같지는 않다. [본문으로]