2023. 11. 20. 10:21ㆍ프로그래밍/JavaScript
우선 try catch를 사용하기 위해서는 return과 throw가 어떤식으로 동작하는지 알아야 한다.
return과 throw는 무슨 차이일까?
return err를 하게 되면 말 그대로 catch문에서 반환하는 값을 부모메서드에게 결과값으로 돌려주게 된다.
따라서 일반적으로는 부모메서드의 변수값에서 결과값을 받고 해당 값의 error 프로퍼티가 false인지 true인지를 통해서 다른 로직을 수행하게 된다.
그러나 throw err를 하게 되면 부모메서드에서도 에러가 전파되기 때문에 try catch문을 써줘야한다.
이를 에러 버블링이라 한다. DOM객체의 이벤트 버블링과 유사한 개념이다.
상황에 맞게 쓰면 될듯하나 return을 사용하는 것이 좀 더 편하고 직관적일 듯하다.
에러를 하나의 메서드(예를들어 서비스 같이 여러곳에서 메서드를 호출하는 경우)에서 처리하는 경우라면 throw로 던지고 서비스에서는 return하는 것이 편할듯하다.
백문이 불여일견이니 코드부터 보자.
- return과 throw의 차이
const test1 = () => {
try {
test2();
} catch (err) {
console.log(err);
return err;
}
}
const test2 = () => {
console.log('test2 execute');
throw new Error('error occurred');
}
const result = test1();
console.log(result);
console.log('function that after error');
어떻게 보면 이 개념을 자세히 모른다는 것에 대해 조금은 부끄러웠다. JAVA할때도 예외처리에 대해서 배웠을 건데 javascript에서 쓸려니 조금 헷갈렸다. 아니, 근야 그 부분에 대해 자세히 알지 않고 두루뭉실하게 알고 있었다고 보는 편이 맞는 듯하다.
어쨌든 return과 throw의 차이는 간단하다.
객체를 돌려줄 것인가 혹은 자신을 호출한 부모 메서드에 에러를 발생시킬 것인가이다.
6번 라인의 return err; 대신 throw err; 로 수정하게 되면 마지막 라인의 console문은 실행이 될까?
정답은 '실행이 되지 않는다.'
그 이유는 간단하게도 throw를 하게 되면 test1함수를 처음 호출한 부분에서도 에러를 발생시키기 때문에 저 부분도 try-catch로 예외처리를 해주어야한다.
그러나 return err는 말 그대로 throw로 인해 catch문으로 넘어온 객체를 그대로 넘기겠다는 것이고 이 부분은 사용자 정의 객체를 통해 return을 하든 어떻게 하든 상관이 없다.
중요한 것은 return을 실행했을 때는 호출한 메서드의 변수값으로 결과값을 반환하고(그냥 우리가 알고 있는 return문) throw를 실행하면 호출한 메서드에서도 에러를 발생시켜 try-catch가 없으면 error가 발생하고 있다면 catch문이 실행되며 이 때의 catch문의 err 파라미터는 throw한 데이터가 되는 것이다.
그러므로 중요한 포인트는 다음과 같다.
1. 가장 최상단에 호출되는 로직은 try catch를 굳이 해줄 필요없다. 그곳에서만 별도의 에러처리가 필요한 상황이 아니라면 말이다.
2. 컨트롤러에서는 try catch를 사용하지 않고 호출 메서드에서 err나 관련 객체나 데이터를 return해서 처리하도록 한다.
'프로그래밍 > JavaScript' 카테고리의 다른 글
[ Javascript ] 암묵적 캐스팅과 산술 연산자 +의 문자열 형변환 (0) | 2024.07.19 |
---|---|
[ Javascript ] Javascript의 변수 선언과 초기화 동작 원리 및 숫자(number) 타입의 크기 (0) | 2024.07.18 |
[Javascript] Spread 연산자 (Spread Operator), 구조분해할당(Destructuring Assignment) (1) | 2023.10.29 |
[Javascript] async와 await, Promise 객체 등등의 개념 정리 (0) | 2023.10.29 |
Node.js, npm, npx, Express.js, React.js, TypeScript 등의 간단한 개념 정리 (0) | 2023.10.22 |