Javascript: try-catch 중첩해서 사용하기

조회수 168회

안녕하세요.

아래의 쿼리 3개가 조건이어서 선행조건을 먼저 작성하고 조건문을 작성하려고 하는데 저 쿼리들 중에 하나라도 undefined이면 에러때문에 코드가 멈춰버리더라구요.

const getEmptyCartQuery = await shopping_cart.findOne({
  (...)
});
const needsUpdatedQuantityQuery = await shopping_cart.findOne({
  (...)
});
const needsNewCartQuery = await shopping_cart.findOne({ 
  (...)
});

그래서 try-catch문으로 예외를 줘서 아래와 같이 코드를 짰는데요.

const data = await shopping_cart.findAll({
    where: { cart_id }
});

try {
    const getEmptyCart = await shopping_cart.findOne({ (...) });
    if (getEmptyCart) {
      await shopping_cart.update({ (...) });
    }
    ctx.body = data;
  } catch (e) {
    try {
      const needsUpdatedQuantity = await shopping_cart.findOne({ (...) });
      if (needsUpdatedQuantity) {
        await shopping_cart.update({ (...) });
      }
      ctx.body = data;
    } catch (e) {
      try {
        const needsNewCart = await shopping_cart.findOne({ (...) });
        if (needsNewCart) {
          await shopping_cart.create({ (...) });
        }
      } catch (e) {
        ctx.status = 400;
        ctx.body = e.message;
      }
    }
  }

어째저째 돌아가긴 합니다만 저런 중첩 try-catch문을 사용하기는 하나요? 너무 보기 지저분한데 try-catch 말고 db조회중 에러나지 않고 코드가 흘러갈 수 있는 방법이 있을까요?

혹시 제가 올린 질문 중 미흡한 부분이 있어서 보충해야할 부분이 있다면 댓글 부탁드립니다.

감사합니다.

1 답변

  • 좋아요

    0

    싫어요
    채택 취소하기

    sequelize find or fail 이라고 찾아봤는데 대충 이런 답변이 보이네요. 어차피 Promise니까 .then()걸어서 쓰라고 하는데 어떨지 모르겠네요. 에러는 뭐라고 뜨는지요?

    • sequelize인줄 바로 알고 답변해주셔서 감사합니다. 처음에 try-catch블럭을 사용하지 않았을때는 무슨 에러가 떴는데 저장도 따로 안했을 뿐더러 너무 많이 돌아와서 기억이 안납니다 ㅠㅠ 일단 저 코드로 에러는 안뜨고 원치않는 버그도 없이 잘 돌긴합니다. stackoverflow와 okky에서 답변을 얻은 결과 엽토군님 말씀대로 Promise니까 catch-then블럭을 써라, Promise.all()을 써라는 답변을 얻어서 어찌저찌 해결했습니다. 일단 try-catch블럭을 저같은 식으로 사용하는 사람은 없나봅니다. 엽토군님 의견도 혹시 try-catch를 if-else처럼 사용하고 중첩해서 저렇게 사용하지는 않는다인가요? Yangeok 2019.7.2 15:20
    • 네. 애초에 try catch는 일반적인 경우(쿼리 결과가 0일때 등)에는 웬만하면 안쓰는 것입니다. 그랬다가 거기서 무슨 다른 진짜 에러가 나버리면 그것도 알 길이 없어지니까요. 엽토군 2019.7.2 15:31
    • 그럼 지금 잘 돌아가다가도 코드 수정이 일어나면 진짜 에러 추적도 안되고 큰일나겠군요. 감사합니다. Yangeok 2019.7.2 21:09

답변을 하려면 로그인이 필요합니다.

Hashcode는 개발자들을 위한 무료 QnA 사이트입니다. 계정을 생성하셔야만 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 계정을 생성하셔야만 글을 작성하실 수 있습니다.