[JS] try catch

Pakxe·2022년 11월 28일
0

JavaScript

목록 보기
5/16
post-thumbnail

try catch 가 뭔가요?

우리가 만든 프로그램은 에러가 발생하면 스크립트가 죽고(=즉시 중단), 콘솔에 에러가 출력된다.
이때 try catch 를 사용해서 에러를 잡는다면(catch) 스크립트가 죽는 걸 막고, 에러를 잡아 다른 행동을 할 수 있다.(다시 입력하라고 알려준다던지)

try catch 문법

try, catch 라는 두 개의 주요 블럭으로 구성된다.

try {
    // 코드
} catch (err) {
	// 에러 핸들링
}
 

try catch 동작 알고리즘

  1. try 안의 코드 실행
  2. 에러가 없으면 catch 블럭에 진입하지 않음
  3. 에러가 있으면 try 코드가 중간 중단되고, catch 블럭으로 제어 흐름이 넘어간다. 이때 변수 err는 다른 이름을 사용해도 되며, 무슨 일이 일어났는 지에 대한 설명이 담긴 에러 객체를 갖고 있다.

try 에서 에러가 발생해도 catch 에서 에러를 처리하기 때문에 스크립트가 죽지 않는 것!

에러 객체?

에러가 발생하면 자바스크립트는 에러 내용이 담긴 객체를 생성한다. 그리고 catch 블럭에 이 객체를 인수로 전달한다. (앞에서 말한 err)

try {

} catch (err) { // <-- 에러 객체로 err대신 다른 이름을 사용할 수 있다.

}

이 에러 객체는 여러개의 프로퍼티를 갖는다.

  • name: 에러 이름. 예를 들어 정의되지 않은 변수 에러면 "ReferenceError" 가 이름이 된다.
  • message: 에러 상세 내용을 담고 있는 메세지
  • stack: 현재 호출 스택. 에러를 유발한 중첩 호출들의 순서 정보를 가진 문자열로 디버깅 목적으로 사용된다.
try {
  lalala; // 에러, 변수가 정의되지 않음!
} catch(err) {
  alert(err.name); // ReferenceError
  alert(err.message); // lalala is not defined
  alert(err.stack); // ReferenceError: lalala is not defined at ... (호출 스택)

  // 에러 전체를 보여줄 수도 있습니다.
  // 이때, 에러 객체는 "name: message" 형태의 문자열로 변환됩니다.
  alert(err); // ReferenceError: lalala is not defined
}

만약 에러에 대한 정보가 필요 없다면 catch에서 (프로퍼티 받는 부분)을 삭제하고 사용해도 된다.

catch {

}

try catch 의 동기적 동작

비동기 코드에서 발생한 에러는 try catch 에서 잡을 수 없다.
따라서 다른 방법을 사용해서 에러 핸들링을 해야한다.
try catch로 비동기 함수를 감싸는 것이 아닌, 비동기 함수가 try catch를 감싸는 형태가 되어야 에러핸들링을 할 수 있다.

비동기 함수 () {
	try {
    	// 문제 코드
    } catch {
    	alert('에러를 잡았습니다.');
    }
}

// 위와 같은 형태로 작성해야하며, 아래와 같은 형태로 작성하면 에러 핸들링을 하지 못한다.
try {
  	비동기 함수(); // 비동기 함수의 내부가 아닌 바깥에 try catch 작성함
} catch (err) {
  
}

try catch finally

사실 에러핸들링은 try catch가 끝이 아니다.
try catch는 finally라는 코드 블럭을 하나 더 가질 수 있다.
finally는 무언가를 실행하고, 실행 결과에 상관없이 실행을 완료하고 싶을 경우 사용된다.

이 블럭 내부의 코드는 아래와 같은 상황에서 실행된다.

  • 에러가 없는 경우: try 실행이 끝난 후
  • 에러가 있는 경우: catch 실행이 끝난 후
try {
	// 코드
} catch(e) {
	// 에러 핸들링
} finally {
	// 항상 실행
}
profile
내가 꿈을 이루면 나는 또 누군가의 꿈이 된다.

0개의 댓글