Techniques for customizing error messages and UIs with error boundaries in React

React provides a feature called error boundaries that help developers handle errors in a more graceful manner. Error boundaries are React components that catch JavaScript errors anywhere in their child component tree, log these errors, and display a fallback UI instead of crashing the whole application.

By default, when an error occurs in a React component, the error is propagated up the component tree until it reaches the top-level component. This behavior can make it challenging to handle errors globally and customize the error messages or UIs. Error boundaries solve this problem by defining components that encapsulate the error handling logic.

In this blog post, we will explore different techniques for customizing error messages and UIs using error boundaries in React.

Creating an error boundary component

To create an error boundary component, you need to define a class component that implements the componentDidCatch lifecycle method. This method is called when an error occurs in a child component of the error boundary.

Here’s an example of an error boundary component:

import React from 'react';

class ErrorBoundary extends React.Component {
  constructor(props) {
    super(props);
    this.state = { hasError: false };
  }

  componentDidCatch(error, errorInfo) {
    this.setState({ hasError: true });
    // Log or report the error
    console.error(error, errorInfo);
  }

  render() {
    if (this.state.hasError) {
      // Render a custom error message or UI
      return <h1>Oops! Something went wrong.</h1>;
    }
    return this.props.children;
  }
}

export default ErrorBoundary;

In the componentDidCatch method, you can set the state to indicate that an error has occurred and optionally log or report the error. Then, in the render method, you can conditionally render a custom error message or UI based on the hasError state.

Using error boundaries in your application

Once you have defined an error boundary component, you can use it to wrap any component that you want to handle errors for. When an error occurs inside the wrapped component, the error boundary will catch it and provide a fallback UI.

To use an error boundary, simply wrap the desired component with the error boundary component. Here’s an example:

import React from 'react';
import ErrorBoundary from './ErrorBoundary';
import MyComponent from './MyComponent';

function App() {
  return (
    <div>
      <h1>Welcome to MyApp</h1>
      <ErrorBoundary>
        <MyComponent />
      </ErrorBoundary>
    </div>
  );
}

export default App;

In this example, any errors that occur within the MyComponent component will be caught by the ErrorBoundary component and the fallback UI defined in the error boundary will be rendered instead.

Customizing error messages and UIs

To customize the error message or UI, you can modify the render method of the error boundary component. You can return any JSX you want, such as a specialized error message, a styled component, or even an error reporting form.

Here’s an example that shows a more customized error message:

class ErrorBoundary extends React.Component {
  // ...

  render() {
    if (this.state.hasError) {
      return <ErrorMessage>Oops! Something went wrong. Please try again later.</ErrorMessage>;
    }
    return this.props.children;
  }
}

In this example, the error boundary component renders an ErrorMessage component with a custom error message when an error occurs.

By customizing the error messages and UIs with error boundaries, you can provide better user experience and make your React applications more robust.

Wrap up

In this blog post, we explored techniques for customizing error messages and UIs with error boundaries in React. Error boundaries allow us to handle errors gracefully and provide fallback UIs when errors occur. By creating and using error boundary components, we can encapsulate error handling logic and customize the error messages displayed to users.