본문 바로가기
[JavaScript]

[javascript] Error

by 쥰5017 2022. 10. 14.

 

Error

에러는 언제나 코드 곳곳에 도사리고 있다. 에러가 발생하지 않는 코드를 작성하는 것은 불가능하기에, 발생한 또는 발생할 에러에 대응하는 코드를 함께 작성해줘야 한다.

console.log('시작');

foo();
// ReferenceError: foo is not defined
// 강제 종료

console.log('끝'); // 에러로 프로그램이 강제 종료되어 이 코드는 실행되지 않는다.

 

 

1. try catch

try ..catch (..finally) 문을 사용하여 프로그램이 강제 종료되지 않게 하고 코드를 실행시킬 수 있다.

try {
	console.log('시작');
	// 실행할 코드(에러 발생 여지가 있는 코드)
	//(1***1); // SyntaxError: Invalid or unexpected token
	//foo(); // ReferenceError: foo is not defined
	//null.foo; // TypeError: Cannot read property 'foo' of null
	//new Array(-1); // RangeError: Invalid array length
	//decodeURIComponent('%'); // URIError: URI malformed
} catch (err) {
	// try 블록에서 에러가 발생하면 이 블록의 코드가 실행
	// 매개변수(이름 자유)에는 try 코드 블록에서 발생한 Error 객체가 전달된다.
	console.error(`에러 발생 : ${err}`);
} finally {
	// 에러 발생과 상관없이 try catch가 완료되면 finally 블록이 실행된다.
	console.log('끝');
}

 

 

2. Error 객체

에러 객체를 생성하는 함수도 있다. 이 함수에는 에러를 설명하는 여러 메세지를 인수로 전달할 수 있다. 에러 객체는 name_에러 객체의 이름 / message_에러 생성자 함수 호출 시 인수로 전달한 메세지 / stack_에러를 발생시킨 콜 스택의 호출 정보를 나타내는 문자열 / 이 3가지의 프로퍼티를 갖는다.

생성자 함수 인스턴스
Error 일반적 에러 객체
SyntaxError 자바스크립트 문법에 맞지 않는 문을 해석할 때
ReferenceError 참조할 수 없는 식별자를 참조했을 때
TypeError 피연산자 또는 인수의 데이터 타입이 유효하지 않을 때 
RangeError 숫자값의 허용 범위를 벗어났을 때
URIError encodeURI 또는 decodeURI 함수에 부적절한 인수를 전달했을 때
EvalError eval 함수에서 발생

 

 

3. throw

에러 객체를 만들고 throw를 통해 에러 객체를 던져야 에러가 발생한다. 에러 객체 자체가 에러 발생을 의미하는 것은 아니다.

try {
  new Error("에러 발생?");
} catch (error) {
  console.log(error);
}

 

위와 같이 작성하면 콘솔창에 아무것도 뜨지 않는다. try문 안에 throw문을 작성해 주어야 한다.

try {
  throw new Error("에러 발생?");
} catch (error) {
  console.log(error);
}
//output: Error: 에러 발생?

 

 

4. 에러의 전파

에러는 호출자 방향으로 전파되는 특성을 가지고 있다. 실행 중인 실행 컨텍스트가 푸시되기 직전에 푸시된 실행 컨텍스트 방향으로 전파된다는 것이다. 어떤 코드 블록 안에서 발생하여 throw 된 에러를 catch 문에서 잡지 못하게 되면 에러가 코드 블록을 타고 올라가 프로그램이 원하는 대로 동작하지 않게 된다.

const foo1 = () => {
  throw Error("1에서 발생한 에러");
};

const foo2 = () => {
  foo1();
};

const foo3 = () => {
  foo2();
};

try {
  foo3();
} catch (error) {
  console.log(error);  //output: Error: 1에서 발생한 에러
}

try문에서 foo3을 호출 > foo3이 foo2를 호출 > foo2가 foo1를 호출한다. 이때 에러는 호출자 방향으로 전파되므로 foo1의 에러 객체가 foo2 > foo3 > 전역으로 전파되는 것이다.

 

 

출처: 모던 자바스크립트 Deep Dive

 

 

댓글