Как работать с границами ошибок в react?

#javascript #reactjs #error-handling

#javascript #reactjs #обработка ошибок

Вопрос:

Я пытаюсь добавить границы ошибок для простого приложения.Когда я нажимаю кнопку, на экране должно отображаться «Что-то пошло не так».Но в моем случае это отображается не так.Как я понимаю ErrorBoundary.js , не работает, так как я попытался записать его в консоль.Когда я запускаю это приложение на экране, оно показывает ошибку: неправильный щелчок

App.js

 
import './App.css';
import Button from './Components/Button';
import ErrorBoundary from './Components/ErrorBoundary';

function App() {
  return (
    <div className="App">
      
        <ErrorBoundary>
        <Button />
        </ErrorBoundary>
    </div>
  );
}

export default App;
  

Button.js

 import React, { Component } from 'react';

class Button extends Component {

    constructor(props) {
        super(props);
        this.state = { error: null };
        this.handleClick = this.handleClick.bind(this);
    }

    handleClick() {
        console.log("Test Button")
        this.state = { error: true};
        throw new Error('Not a correct click');
    }


    render() {
        if (this.state.error) {
            return <h1>Caught an error!</h1>
        }
        return <button onClick={this.handleClick} style={{ color: 'white', background: 'blue', width: 200, height: 50 }}>Throw Error</button>
    }
}

export default Button;
  

ErrorBoundary.js

 import React, { Component } from 'react'

class ErrorBoundary extends Component {

    constructor (props){
        super(props);

        this.state = {
            hasError: false,
            error: null,
            info: null
        }
    }

    static getDerivedStateFromError(error){
        this.state.hasError = true
    }

    componentDidCatch (error,info){
        console.log(error);
        console.log(info)
    }

    render() {
        if(this.state.hasError){
            return <h2>Something went wrong</h2>
        }
        return this.props.children;
    }
}

export default ErrorBoundary;

  

Ответ №1:

Все выглядит правильно, но в соответствии с документами:

Границы ошибок не перехватывают ошибки для:

  • Обработчики событий (подробнее)
  • Асинхронный код (например, обратные вызовы setTimeout или requestAnimationFrame)
  • Рендеринг на стороне сервера
  • Ошибки, возникающие в самой границе ошибки (а не в ее дочерних элементах)

По моему опыту, границы ошибок улавливают ошибки в render() и останавливают их распространение за пределы границы.

Цель, стоящая за границами ошибок, состоит в том, чтобы избежать наполовину нарушенного состояния рендеринга React.

Рекомендуется использовать try/catch для перехвата ошибок в обработчиках событий.

Переход throw к Button.render должен помочь ErrorBoundary перехватить ошибку в вашем примере:

 handleClick() {
    console.log("Test Button")
    this.state = { error: true};
    // throw new Error('Not a correct click');
}

render() {
    if (this.state.error) {
        throw new Error('Not a correct click')
        return <h1>Caught an error!</h1>
    }
    return <button onClick={this.handleClick} style={{ color: 'white', background: 'blue', width: 200, height: 50 }}>Throw Error</button>
}