Error Boundaries
어떤 오류는 예방할 수 없으며
어떤 오류는 어플리케이션의 어떤 부분에서 다른 부분으로
무언가가 잘못됐다고 전달할 때 사용되기도 한다.
예를 들어 HTTP요청을 보냈는데 서버가 일시적으로 응답이 없을 경우,
그 요청에 대해 응답할 수 없고 어플리케이션에서 오류가 발생하게 될 것이다.
componentDidUpdate() {
if (this.props.users.length === 0) {
throw new Error("No users provided!");
}
}
throw new Error코드는 콜스택에서 오류를 발생시키는 코드다.
오류 처리가 되지 않으면 전체 애플리케이션이 강제 중단 되어 버린다.
try-catch 문
일반적인 자바스크립트 문에서는 try-catch 문을 사용한다.
componentDidUpdate() {
try {
someCodeWhichMightFail()
} catch (err) {
}
오류를 catch해 대체 코드를 실행하는 것.
그런데 이것은 오류가 발생한 컴포넌트 안에서 해결하지 않고
부모 컴포넌트에서 처리하고 싶다면
try-catch문은 사용할 수 없다.
이것은 정규 자바스크립트문을 사용하는 곳에서만 쓸 수 있기 때문이다.
jsx코드를 통해 연결되는 리액트에서는 사용할 수 없다.
처리하기 위해서는
Error boundary를 만들자
그 안에는 componentDidCatch 넣는다.
class ErrorBoundary extends Component {
componentDidCatch() {
}
render() {
return this.props.children;
}
}
두 개의 함수형 컴포넌트를 추가할 수 없으며
같은 역할을 하는 함수형 컴포넌트에서의 기능은 지금까지는 없다.
class여야 하고, 그 안에는 componentDidCatch를 사용해야 한다.
이 메서드는 자식 컴포넌트 중 하나가 오류를 발생시키거나 전달할 때 발동된다.
ErrorBoundary에서도 그랬듯이 render를 하고 this.props.children을 return 한다.
ErrorBoundary컴포넌트로 보호되어야 하는 컴포넌트를 둘러싸야 하기 때문이다.
UserFinder.js파일에서
<ErrorBoundary>
<Users users={this.state.filteredUsers} />
</ErrorBoundary>
이런 식으로 말이다.
오류가 발생할 가능성이 있는 컴포넌트를
위와같이 감싸면 된다.
여러 컴포넌트를 한 번에 감쌀 수도 있다.
Error boundary 에서 error가 발생했을 때 처리할 코드 추가 작성
class ErrorBoundary extends Component {
componentDidCatch(error) {}
오류가 발생했을 때 조치가 필요하기 때문에
매개변수로 error 객체를 받아온다.
이는 리액트가 자동으로 보내줄 것이다.
오류를 확인해 무엇이 문제인지 확인하고
개별 오류마다 서로 다른 로직을 실행하게 한다.
각 오류마다 개별 오류 경계가 필요하다.
class ErrorBoundary extends Component {
constructor() {
super();
this.state = {hasError: false}
}
constructor를 추가하고 그 안에 super생성자를 추가하고
error의 초기 상태를 false로 설정해 놓는다.
이름은 어떻든 상관없다.
그리고 error를 캐치할 때 hasError: true로 state를 설정한다.
componentDidCatch(error) {
this.setState = { hasError: true };
}
hasError가 true일 때
Something went wrong! 이란 문구가 보이도록 해준다.
render() {
if (this.state.hasError) {
return <p>Something went wrong!</p>
}
ErrorBoundary 사용 이유는 무언가가 잘못되더라도
어플리케이션 전체가 작동중단되지 않고 오류를 확인한 뒤에
자바스크립트의 try-catch문과 같이
처리할 수 있게 된다.
함수형 컴포넌트에서는 사용할 수 없다.
'공부기록 > [강의노트] Udemy React 완벽가이드 101~200' 카테고리의 다른 글
# 184 [udemy React 완벽 가이드 노트] SWAPI (The Star Wars API) axios, fetch API, async await (0) | 2022.10.02 |
---|---|
# 182 [udemy React 완벽 가이드 노트] 리액트가 데이터베이스와 소통하는 방법 (1) | 2022.09.30 |
# 177 [udemy React 완벽 가이드 노트] 클래스 컴포넌트와 컨텍스트 (1) | 2022.09.30 |
# 175 [udemy React 완벽 가이드 노트] 클래스 컴포넌트 Lifecycle (0) | 2022.09.29 |
# 174 [udemy React 완벽 가이드 노트] class기반 컴포넌트에서 state및 이벤트 작업하기 (0) | 2022.09.29 |