본문 바로가기
Language/Javascript

에러 핸들링 (Error handling)

by 노믹 2022. 12. 12.

에러 핸들링(Error handling)이란?

에러 핸들링은 에러를 관리하는 방법이고, 예상치 못한 상황에 대처하는 방식입니다.

에러는 예상할 수 있는 에러예상치 못한 에러로 구분할 수 있는데, 일반적인 애플리케이션을 설계할 때에는 예상치 못한 에러 상황이 더욱 많이 일어날 것으로 가정해야 합니다.

프로그래머가 작성한 코드에서 예상치 못한 에러가 일어날 가능성은 언제나 존재하고, 이러한 에러 상황을 대비해 언제든지 처리할 수 있어야 합니다.

 

try/catch

서버에서 에러가 발생하지 않게 하기 위해서 예외 처리를 진행합니다.

예외 처리는 일반적으로 try ... catch 문을 사용합니다.

users에 들어있는 이름들을 String.toUpperCase()를 이용하여 대문자로 변경하려 할 때 문자열(String)이 아닌 데이터가 들어온다면 에러가 발생합니다.

이렇게 예상치 못한 에러에 대처하기 위해선 try ... catch문으로 코드 전체를 감쌀 수 있습니다.

에러가 발생하더라도 프로그램이 멈추지 않고 에러를 기록할 수 있습니다.

const users = ["Lee", "Kim", "Park", 2];

try {
  for (const user of users) {
    console.log(user.toUpperCase());
  }
} catch (err) {
  console.error(`Error: ${err.message}`);
}

// LEE
// KIM
// PARK
// Error: user.toUpperCase is not a function

throw

위에서 에러를 핸들링하는 과정만 공부하였다면, 에러는 무조건 차단하고 발생시키면 안 되는 걸까요?

아닙니다. 프로그래머의 입장에서 에러는 고의로 에러를 발생시키기도 해야합니다.

예를 들어 은행 애플리케이션의 현금 인출 서비스를 만든다고 할 때, 계좌의 잔고가 요청받은 금액보다 적다면 현금 인출을 막고 예외를 발생시켜야 합니다. 이럴 때 사용하는 것이 throw입니다.

throw를 호출하면 그 즉시 현재 실행되고 있는 함수는 실행을 멈추게 됩니다.

function withdraw(amount, account) {
  if (amount > account.balance)
    throw new Error("잔고가 부족합니다.");
  account.balance -= amount;
	console.log(`현재 잔고가 ${account.balance}남았습니다.`); // 출력되지 않음
}

const account = { balance: 1000 };
withdraw(2000, account);

// Error: 잔고가 부족합니다.

finally

try에서는 HTTP 연결이 되고 있거나 파일과 같은 특정한 '자원'을 가지고 처리할 때가 있습니다. 하지만 해당 '자원'을 계속 가지고 있으면, 무의미한 메모리를 차지하게 될 것이므로 에러 여부와 상관없이 일정 시점에서는 해당 '자원'을 삭제시켜야 합니다.

그렇다면 이 '자원'을 삭제하는 시점은 언제가 되어야 할까요? 에러가 언제든지 발생할 수 있는 try? 아니면 에러가 일어났을 때 실행되는 catch? 이런 상황에서는 finally가 필요합니다.

finally는 에러 발생 유무와 상관없이 언제든지 실행됩니다.

function errorException(isThrow) {
  try {
    console.log('자원을 할당하였습니다.');
    if (isThrow) throw new Error();
  } catch (error) {
    console.log('에러가 발생했습니다.');
  } finally {
    console.log('자원을 제거하였습니다.');
  }
}

errorException(false);
// 자원을 할당하였습니다.
// 자원을 제거하였습니다.
errorException(true);
// 자원을 할당하였습니다.
// 에러가 발생했습니다.
// 자원을 제거하였습니다.

 

'Language > Javascript' 카테고리의 다른 글

구조 분해 할당  (0) 2022.12.15
클래스(Class)  (0) 2022.12.12
객체 리터럴  (0) 2022.12.12
비동기 함수 (Async Function)  (0) 2022.12.12
프로미스(Promise)  (0) 2022.12.12