May 23, 2021 • ☕️☕️ 8 min read
with 썬
1. 예상 X 해결 방법 O
2.예상 X 해결 방법 X
3. 예상 O 해결 방법 X
dangerouslySetInnerHTML
4. 예상 O 해결 방법 O
Ref https://jbee.io/react/error-declarative-handling-2/
then~catch
체이닝에서 잡는 에러와, async-await 구문의 try~catch
에서 잡는 에러는 어떤 차이가 있을까요?const makeRequest = () => {
try {
getJSON()
.then((result) => {
// this parse may fail
const data = JSON.parse(result);
console.log(data);
})
.catch((err) => {
console.log(err);
});
} catch (err) {
console.log(err);
}
};
const makeRequest = async () => {
try {
// this parse may fail
const data = JSON.parse(await getJSON());
console.log(data);
} catch (err) {
console.log(err);
}
};
→ Promise의 then chaining 안에서 발생한 JSON.parse에러는 try~catch
문에서 잡히지 않는다.
response.ok
로 한번 더 잡아줌+ 👾 async-await에서 try-catch를 쓰는 게 무의미하다? (참고)
→ 최초로 fetch를 해오고, 다음 함수에서 JSON.parse하고, 다음 함수에서 사용해줄 때
try~catch
로 묶어줄 필요가 없다. 어차피 상위에서 내려오기 때문에 Error catch가 가능하다.Ref https://medium.com/@constell99/자바스크립트의-async-await-가-promises를-사라지게-만들-수-있는-6가지-이유-c5fe0add656c
// action creator
export const getCartItemsRequest =
() => async (dispatch: Dispatch<GetCartItemsAction>) => {
dispatch({ type: GET_CART_ITEMS_REQUEST });
try {
const response = await api.get("customers/zigsong/carts");
const cartItems = snakeToCamel(response.data);
dispatch({ type: GET_CART_ITEMS_SUCCESS, cartItems });
} catch (error) {
dispatch({ type: GET_CART_ITEMS_FAILURE, error });
}
};
// 사용처
dispatch(addCartItemRequest(product))
.then(() => {
enqueueSnackbar(MESSAGE.ADDED_CART_ITEM_SUCCESS);
})
.catch((error: Error) => {
enqueueSnackbar(error.message);
});
Ref https://ko.reactjs.org/docs/error-boundaries.html
403, 500 과 같은 공통적으로 처리 할 수 있는 에러들은 미들웨어 같은 역할의 레이어에서 처리하도록 하여 매 함수마다 중복되는 코드를 제거 할 수 있습니다. axios 같은 라이브러리는 그런 기능을 지원하지만 fetch API 에는 그런 기능이 없기 때문에 별도로 만들어서 쓰거나 다른 라이브러리를 쓰거나 해야 합니다.
React Query 예시코드
axios interceptor 링크
axios.interceptors.response.use(
(response) => {
return response;
},
(error) => {
if (error.response.status === "400") {
// 에러 핸들링
}
return Promise.reject(err);
}
);
const api = axios.create({
baseURL: "https://shopping-cart.techcourse.co.kr/api/",
});
// 컴포넌트
api.get("").then(() => {});
클라이언트단 에러
javascript-subway 미션의 setCustomValidity
setInputValidity() {
const validityState = this.$stationNameInput.validity;
if (validityState.valueMissing) {
this.$stationNameInput.setCustomValidity('역 이름을 입력해 주세요.🙀');
} else if (validityState.tooShort) {
this.$stationNameInput.setCustomValidity('2글자 이상 입력해 주세요.👾');
} else if (validityState.patternMismatch) {
this.$stationNameInput.setCustomValidity('공백, 특수문자를 제외한 한글을 입력해 주세요.🤓');
} else {
this.$stationNameInput.setCustomValidity('');
}
}
비동기 에러 처리
reponse.ok
도 잘 사용하기!