개발공부를 시작하면서 낡고병든머리로는힘들어서 PyCham을 사용하고있었다
사실 뭐 이것말고도 다른 ide에서도 동일한 에러가 있을거같긴 하지만..
그 동안 코드가 정상적으로 작동하지 않던것도 아니고 약한 경고로 '고치면 좋겠다~' 정도의 느낌이라 방치하고 있었다. 그러다 서비스로직에서 무럭무럭 자라나고있는 저 throw 경고문이 눈에 거슬리기 시작해서 해결하기로 했다.
원인
처음엔 '로컬에서 캡처되었다' 가 무슨 말인지 도통 이해가 안되었었다.
좀 더 쉽게 풀어보자면
throw 를 try~catch가 캡쳐하고 있다
즉, 예외 처리가 중복으로 되고 있다는 소리다.
조건문을 통해 throw가 실행되면 해당 로직은 중단되고 에러는 catch절로 이동하고, 해당 에러를 호출자인 컨트롤러로 보낸다.
컨트롤러는 해당 에러를 next객체를 통해 에러미들웨어로 보내게 된다.
//예시
const editPost = async (postId, userId, postData) => {
try {
const post = await prisma.post.findUnique({ where: { id: postId } });
if (!post) throw new Error('존재하지 않는 게시글');
if (post.writerId !== userId) throw new Error('권한이 없음');
const filteredData = Object.entries(postData).reduce(
(acc, [key, value]) => {
if (value !== null) {
acc[key] = value;
}
return acc;
},
{},
);
return await prisma.post.update({
where: {
id: postId,
},
data: filteredData,
});
} catch (error) {
console.error(error);
throw error;
}
};
아니 그래서 쓰면 외않되?
try~catch 문 안에서 throw를 사용한다고 해서 당장의 큰 문제는 없다.아마도 그래서 ide에서도 약한 경고상태로 놔두는게 아닐까..
다만 에러를 재전파하고 있기 때문에 디버깅에 부정적인 영향을 줄 수 있고 코드의 복잡성이 증가할 수 있기때문에, 에러를 별도로 핸들링하기위해 throw를 사용하고싶다면 try~catch문 밖에서 사용해주는게 좋을것 같다.
//예시
const editPost = async (postId, userId, postData) => {
const post = await prisma.post.findUnique({ where: { id: postId } });
if (!post) throw new Error('존재하지 않는 게시글');
if (post.writerId !== userId) throw new Error('권한이 없음');
try {
const filteredData = Object.entries(postData).reduce(
(acc, [key, value]) => {
if (value !== null) {
acc[key] = value;
}
return acc;
},
{},
);
return await prisma.post.update({
where: {
id: postId,
},
data: filteredData,
});
} catch (error) {
console.error(error);
throw error;
}
};