This is my Error Boundary file -
class ErrorHandling extends Component {
state = { hasError: false }
componentDidCatch() {
this.setState({ hasError: true })
}
render() {
// debugger
if (this.state.hasError) {
return <div>Error in Component</div>
}
return this.props.children
}
}
And the other file is -
import React, { Component } from 'react';
// Intentionally I have added syntax error below 'd'
function Intermediate(props) {
return <h1>hi</h1>;d
}
export default Intermediate
And in my App.js
<ErrorHandling>
<Intermediate />
</ErrorHandling>
It is causing the application to break without catching the error. Here is the error is seen on the browser screen
The more detailed version here- https://codepen.io/meghana1991/pen/abojydj?editors=0010
When I use the same code in my local with multiple files as above listed, it doesn't work
You can't catch compile-time errors, the Error Boundaries are for run-time errors within the UI.
Refer to Compile time vs run time errors.
Moreover, you have to use getDerivedStateFromError
in order to add additional render on fall back UI:
class ErrorBoundary extends React.Component {
state = {
hasError: false,
error: { message: '', stack: '' },
info: { componentStack: '' }
};
static getDerivedStateFromError = error => {
return { hasError: true };
};
componentDidCatch = (error, info) => {
this.setState({ error, info });
};
render() {
const { hasError, error, info } = this.state;
const { children } = this.props;
return hasError ? <ErrorComponent/> : children;
}
}
For checking your ErrorBoundary
, throw an error from a reachable section in the component tree which is not:
const ButtonComponent = () => {
throw Error("error!");
return <></>;
};
Note: In development env you will always see the error overlay unless you turn it off or close it with the X button.
Full example:
const ErrorComponent = () => {
return <h1>Something went wrong</h1>;
};
class ErrorBoundary extends React.Component {
state = {
hasError: false,
error: { message: "", stack: "" },
info: { componentStack: "" }
};
static getDerivedStateFromError = error => {
return { hasError: true };
};
componentDidCatch = (error, info) => {
this.setState({ error, info });
};
render() {
const { hasError, error, info } = this.state;
console.log(error, info);
const { children } = this.props;
return hasError ? <ErrorComponent /> : children;
}
}
const ButtonComponent = () => {
throw Error("error!");
return <></>;
};
const App = () => {
return (
<ErrorBoundary>
<ButtonComponent />
</ErrorBoundary>
);
};
The thing is: the nice fallback UI you can see in the React docs example only appears in production. So you have to run the suggested by create-react-app
(id you use it) command:
npm run build
# wait for it to finish
serve -s build
Then open localhost:5000
in your browser (if you see this address in the terminal mentioned). This way the React docs example works fine.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With