try catch와 특징
try..catch는 스크립트가 죽는 걸 방지하고, 에러를 잡아서 더 합당한 무언가를 할 수 있게 해줍니다. 일반적으로 실무에서는 fetch를 사용할때 많이 사용하는데 문서를 살펴보니 아래와 같은 특징이 있다고 합니다.
- try..catch는 오직 런타임 에러에만 작동합니다.
try..catch는 실행 가능한 코드에만 동작합니다. 실행 가능한 코드는 유효한 자바스크립트 코드를 의미합니다. 중괄호 짝이 안 맞는 것처럼 코드가 문법적으로 잘못된 경우엔 try..catch가 작동하지 않습니다.
try {
{{{{{{{{{{{{
} catch(e) {
alert("유효하지 않은 코드이기 때문에, 자바스크립트 엔진은 이 코드를 이해할 수 없습니다.");
}
- try catch는 동기적으로 작동합니다.
try..catch는 동기적으로 작동합니다. setTimeout처럼 스케쥴 된(scheduled) 코드에서 발생한 예외는 try..catch에서 잡아낼 수 없습니다
try catch 사용하기
JSON.parse를 통해 실무에서 주로 사용되는 패턴을 살펴봅니다.
아래 예제와 같이 잘못된 json이 들어온 경우, JSON.parse는 에러를 만들기 때문이 스크립트가 죽습니다.
그리고 catch 블록을 통해 에러에 관한 메시지들이 출력됩니다.
에러 다시 던지기
try..catch에서 중요한 패턴이 하나있는데 바로 에러 다시 던지기 패턴입니다.
JSON.parse에서 발생한 에러를 try..catch를 사용해서 잡을 수 있었지만 만약 JSON.parse가 아닌 에러가 발생했을때는 어떻게 처리하는것이 좋을까요?
먼저 위에 예시를 바탕으로 다른 에러를 만들어 보겠습니다.
예제를 확인해보면 catch는 예상치 못한 에러를 잡아내 주긴 했지만, JSON.parse에 대한 에러가 아닌 blah()라는 정의되지 않은 함수를 호출한 것에 대한 에러를 뱉고 있습니다. (ReferenceError, blah is not defind)
이렇게 에러 종류와 관계없이 동일한 방식으로 에러를 처리하는 것은 디버깅을 어렵게 만들기 때문에 좋지 않습니다.
이런 문제를 피하고자 ‘다시 던지기(rethrowing)’ 기술을 사용합니다.
catch는 알고 있는 에러만 처리하고 나머지는 ‘다시 던져야’ 합니다.
다시 던지기는
- catch가 모든 에러를 받습니다.
- catch(err) {} 블록 안에서 에러 객체 err를 분석합니다.
- 에러 처리 방법을 알지 못하면 throw err를 합니다.
보통 에러 타입을 instanceof 명령어로 체크합니다.
이렇게 알 수 있는 에러만 처리하고 다시 던져서 알 수 없는 에러는 ‘건너뛸 수’ 있습니다. 하지만 위 예제는 에러 타입만 알 수 있을뿐 그렇게 코드가 많이 달라진 것 같진 않습니다.
이렇게 건너뛴 에러는 다시 한번 try..catch로 잡아야 합니다. 내가 어떤 행동을 취하고 어떤 행동에서 에러를 잡을 것인지 명확하게 코드를 작성해줘야합니다.(함수로 묶기)
이렇게 내가 catch 블록에서 예상했거나 어떻게 다룰지 알고 있는 에러를 다루고, 예상치 못한 에러는 다시 던지기를 통해 처리합니다.
마치며
try..catch의 에러 다시 던지기 패턴을 통해 에러를 잡고, 예상치 못한 에러는 다시 던지기를 통해 처리하는 방법을 알아보았습니다. 이렇게 하면 에러를 잡고, 예상치 못한 에러는 다시 던지기를 통해 처리할 수 있습니다.
꼼꼼하고 섬세하게 에러 처리에 대한 대응은 알 수 없는 에러가 발생했을때 빠르고 효율적인 대처를 할 수 있게 도와주기 때문에 코드를 작성하는 것 외에도 에러 처리에도 신경쓰는 것이 좋을 것 같습니다.
읽어주셔서 감사합니다.