Error Boundaries
Error boundaries가 잡지 않는 에러들
setTimeOut
혹은 requestAnimationFrame
콜백)클래스 컴포넌트에서 생명주기 메서드 static getDerivedStateFromError()
나 componentDidCatch()
를 정의하면 그 클래스 컴포넌트 자체가 error boundary가 됨
render
단계에서 호출되므로, 부수효과를 발생시키면 안 됨componentDidCatch()
를 대신 사용하기error
와 어떤 컴포넌트가 오류를 발생시켰는지에 대한 정보를 componentStack
키의 값으로 갖고 있는 객체 info
를 매개변수로 받음커밋
단계(React가 변경 사항을 반영하는 단계)에서 호출되므로, 부수 효과를 발생시켜도 됨window
까지 전파되므로, window.onerror
나 window.addEventLister('error', callback)
가 이 메서드에서 잡은 오류를 인터셉트함unstable_handleError
메서드는 더 이상 동작하지 않으며 componentDidCatch로 변경해야함class ErrorBoundary extends React.Component {
constructor(props) {
super(props);
this.state = { hasError: false };
}
static getDerivedStateFromError(error) {
// state를 갱신하여 다음 렌더링에서 대체 UI를 표시함
return { hasError: true };
}
componentDidCatch(error, info) {
// Example "componentStack":
// in ComponentThatThrows (created by App)
// in ErrorBoundary (created by App)
// in div (created by App)
// in App
logComponentStackToMyService(info.componentStack);
}
render() {
if (this.state.hasError) {
// 별도로 작성한 대체 UI를 렌더링할 수 있음
return <h1>Something went wrong.</h1>
}
return this.props.children;
}
}
class App extends React.Component {
return (
<ErrorBoundary>
<MyWidget />
</ErrorBoundary>
);
}
catch {]
구문과 유사하게 동작하지만 컴포넌트에 적용됨React16부터는 Error boundaries에서 포착되지 않은 에러로 인해 전체 React 컴포넌트 트리의 마운트가 해제됨
프로덕션 환경에서 발생한 처리되지 않은 예외 상황에 대해 학습하고 수정할 수 있도록 JavaScript 에러 리포팅 서비스를 활용하거나 직접 작성하는 것을 권장함
@babel/plugin-transform-react-jsx-source
플러그인을 Babel 설정에 추가하여 사용할 수 있음Function.name
프로퍼티에 따라 다름try {
showButton();
} catch (error) {
// ...
}
무엇
을 렌더링할지 구체화함<Button />
try/ catch
구문을 이용하기class MyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { error: null };
this.handleClick = this.handleClick.bind(this);
}
handleClick() {
try {
// 에러를 던질 수 있는 무언가를 해야합니다.
} catch (error) {
this.setState({ error });
}
}
render() {
if (this.state.error) {
return <h1>Caught an error.</h1>
}
return <button onClick={this.handleClick}>Click Me</button>
}
}