에러와 예외
프로그래밍 간 우리는 항상 에러(Error)와 마주한다. 잘못된 문법을 사용했거나, 사전에 정의되지 않은 메서드를 사용하는 등의 경우에 발생한다. 예외(Exception)는 그 상황 자체를 가리키는 조금 다른 개념이지만, 일반적으로 혼용하여 사용하는 경우가 많다. 이들은 프로그램의 작동을 멈추게 하고, 다음 코드로 넘어갈 수 없게 된다. 따라서 이러한 에러나 예외가 발생하지 않도록 미리 방지할 필요가 있고, 발생했음에도 이상 없이 원래의 코드가 작동될 수 있는 예외처리가 필요하다.
예외처리
try / catch
자바스크립트를 포함한 많은 언어에서 제공하는 일반적인 예외처리 구문이다. try{}를 통해 실행시킬 코드를 작성하고, 실행 중 에러가 발생하면 catch{}를 통해 로그를 확인, 처리하거나 무시할 수 있다. catch{}에서는 지역변수 e를 인자로 받는데, 이를 통해 사용자가 직업 정의한 에러 값이나 자바스크립트 자체에서 제공하는 에러 이벤트 정보({name, message, stack})를 확인할 수 있다.
try {
console.log(array)
} catch (e) {
console.log(e.message)
}
>>array is not defined
finally
예외 발생 여부와 관계 없이 try{} 내부 코드의 완료되었다면 무조건 실행되는 코드이다. break, return 등의 즉시 반환문이 실행된 후에도 finally{}의 코드가 실행된다. catch와 함께 쓰이는 것이 일반적이며, 자원 해제 등의 정리 작업이나 초기화에 주로 사용된다.
try {
const array = [3,4,2]
array = [2,3,2]
} catch (e) {
console.log(e.message)
}finally {
const array = []
}
throw
예외 처리 테스트나 디버깅 등을 위해 임의로 예외를 발생시킬 때 사용한다. 예외 던지기라고도 하며, 직접 예외를 발생시켜 catch{}에서 처리하는 방식으로 사용한다.
try {
throw new Error("에러!")
} catch (e) {
console.log(e.message)
console.log("발생!")
}
비동기 함수에서의 예외처리
비동기 처리 작업은 자바스크립트의 처리 순서 상 호출 스택에 있던 동기 처리가 완료된 후에 이루어진다. 이들을 스케줄되어 있다(scheduled)고 말하는데, 발생 시점이 다르기 때문에 일반적인 동기 환경에서의 try..catch를 통해 예외처리가 불가능하다. 따라서 작성한 비동기 코드 내부에 try..catch를 구현하거나, Promise의 then..catch 구문을 이용해 예외처리를 관리할 수 있다. Promise와 Async/Await을 다룰 때 좀 더 자세히 들여다 볼 예정.
Reference