🚦

[JS] 에러 핸들링


에러가 발생하면 스크립트는 즉시 중단되고 콘솔에 에러가 출력된다. 하지만 스크립트가 죽게 내버려두는 것보다 에러를 잡아서(catch) 에러에 따라 처리할 수 있는 방법이 있다.

try...catch

1try {
2 // 코드
3} catch (error) {
4 // 에러 핸들링
5}

위 코드에서 실행흐름은 다음과 같다.

  1. try 안의 코드가 실행된다.
  2. 에러가 없다면, catch 블록을 건너뛴다.
  3. 에러가 있다면, try안 코드의 실행이 중단되고 catch 블록으로 제어 흐름이 넘어간다. error에는 에러에 대한 설명이 담긴 에러 객체가 포함된다.

에러 객체

에러가 발생하면 자바스크립트는 에러의 상세내용이 담긴 객체를 생성한다. 이 객체는 catch 블록에 인수로 전달된다.

내장 에러 객체 전체와 에러 객체는 두 가지 주요 속성을 가진다.

  • name: 에러 이름
  • message: 에러 상세 내용

stack: 현재 호출 스택. 에러를 유발한 중첩 호출들의 순서 정보를 가진 문자열이다. 표준은 아니지만, 대부분의 호스트 환경에서 지원된다.

throw 연산자

throw 연산자는 에러를 생성한다.

1throw <error object>

이론적으로는 원시형 자료를 포함한 어떤 것이든 에러 객체로 사용할 수 있다. 하지만 내장 에러와 호환을 위해 되도록 에러 객체에 namemessage 속성을 넣어주는 것이 좋다.

자바스크립트는 Error, SyntaxError, ReferenceError, TypeError등의 표준 에러 객체 관련 생성자를 지원한다. 이 생성자들을 사용해 여러 에러 객체를 생성할 수 있다.

1let error = new Error(message);
2let error = new SyntaxError(message);
3let error = new ReferenceError(message);
4// ...

내장 생성자를 사용해 만든 내장 에러 객체의 name 속성은 생성자의 이름과 같은 값을 갖는다. message는 인수에서 가져온다.

finally

try..catchfinally라는 코드 절을 하나 더 가질 수 있다.

finally는 에러가 없어서 try 실행이 끝난 후, 혹은 에러가 있어서 catch 실행이 끝난 후 실행된다. 에러가 있건 없건 항상 실행된다는 소리다.

1try {
2
3} catch (error) {
4
5} finally {
6 // 항상 실행
7}

finally 절은 try..catch 절을 빠져나가는 어떤 경우에도 실행된다. try 안에서 return을 사용해 명시적으로 빠져나가는 것도 마찬가지다.

1function func() {
2 try {
3 return 1;
4 } catch (e) {
5 /* ... */
6 } finally {
7 console.log("실행됩니다!");
8 }
9}
10
11console.log(func()); // finally 안의 alert가 실행되고 난 후, 실행됨
12// -> 실행됩니다!
13// -> 1

참조: ko.javascript.info