рд░рд┐рдПрдХреНрдЯ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдЧ рдХреА рд╕рдВрддрд░реА рджреВрд░рд╕реНрде рдирд┐рдЧрд░рд╛рдиреА

рд╣рдо рд░рд┐рдПрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕реЗрдВрдЯреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЦреЛрдЬ рдХрд░ рд░рд╣реЗ рд╣реИрдВред

рд░рд┐рдПрдХреНрдЯ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдЧ рдХреА рд╕рдВрддрд░реА рджреВрд░рд╕реНрде рдирд┐рдЧрд░рд╛рдиреА

рдпрд╣ рдЖрд▓реЗрдЦ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реЗрдВрдЯреНрд░реА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рд░рд┐рдкреЛрд░реНрдЯрд┐рдВрдЧ рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рд╡рд╛рд▓реА рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ: ╨з╨░╤Б╤В╤М 1.

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕реЗрдВрдЯреНрд░реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛; рд╕рдВрддрд░реА рд╡реЗрдмрд╕рд╛рдЗрдЯ рд╕реЗ. рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд░рд┐рдПрдХреНрдЯ рдЪреБрдирддреЗ рд╣реИрдВред

рд╣рдо рд░рд┐рдПрдХреНрдЯ рд╡рд╛рд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдкрдиреЗ рджреЛ рдмрдЯрди, рд╣реИрд▓реЛ рдФрд░ рдПрд░рд░ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдЕрдкрдирд╛ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдХрд░ рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ:

npx create-react-app react-app

рдлрд┐рд░ рд╣рдо рд╕реЗрдВрдЯреНрд░реА рдкреИрдХреЗрдЬ рдЖрдпрд╛рдд рдХрд░рддреЗ рд╣реИрдВ:

yarn add @sentry/browser

рдФрд░ рдЗрд╕реЗ рдкреНрд░рд╛рд░рдВрдн рдХрд░реЗрдВ:

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк/src/index.js

...
import * as Sentry from '@sentry/browser';

const RELEASE = '0.1.0';
if (process.env.NODE_ENV === 'production') {
  Sentry.init({
    dsn: 'https://[email protected]/1289887',
    release: RELEASE,
  });
}
...

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ:

  • рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореБрджреНрджреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рдХрдВрд╕реЛрд▓ рдЬреИрд╕реЗ рдЕрдиреНрдп рддрдВрддреНрд░ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдЙрддреНрдкрд╛рджрди рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рд╕реЗрдВрдЯреНрд░реА рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рддреЗ рд╣реИрдВ

рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдЕрдкрдиреЗ рд╣реИрд▓реЛ рдФрд░ рдПрд░рд░ рдмрдЯрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ:

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк/src/Hello.js

import React, { Component } from 'react';
import * as Sentry from '@sentry/browser';

export default class Hello extends Component {
  state = {
    text: '',
  };
  render() {
    const { text } = this.state;
    return (
      <div>
        <button
          onClick={this.handleClick}
        >
          Hello
        </button>
        <div>{text}</div>
      </div>
    )
  }

  handleClick = () => {
    this.setState({
      text: 'Hello World',
    });
    try {
      throw new Error('Caught');
    } catch (err) {
      if (process.env.NODE_ENV !== 'production') {
        return;
      }
      Sentry.captureException(err);
    }
  }
}

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк/src/MyError.js

import React, { Component } from 'react';

export default class MyError extends Component {
  render() {
    return (
      <div>
        <button
          onClick={this.handleClick}
        >
          Error
        </button>
      </div>
    )
  }

  handleClick = () => {
    throw new Error('Uncaught');
  }
}

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк/src/App.js

...
import Hello from './Hello';
import MyError from './MyError';

class App extends Component {
  render() {
    return (
      <div className="App">
        ...
        <Hello />
        <MyError />
      </div>
    );
  }
}

export default App;

рд╕рдорд╕реНрдпрд╛ (рд╕реНрд░реЛрдд рдорд╛рдирдЪрд┐рддреНрд░)

рд╣рдо рдирд┐рдореНрди рджрд░реНрдЬ рдХрд░рдХреЗ рдкреНрд░реЛрдбрдХреНрд╢рди рдмрд┐рд▓реНрдб рдХреЗ рд╕рд╛рде рд╕реЗрдВрдЯреНрд░реА рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

yarn build

рдФрд░ рдмрд┐рд▓реНрдб рдлрд╝реЛрд▓реНрдбрд░ рд╕реЗ рджрд░реНрдЬ рдХрд░реЗрдВ:

npx http-server -c-1

рдЬрд┐рд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╣рдореЗрдВ рддреБрд░рдВрдд рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╕реЗрдВрдЯреНрд░реА рдХреЗ рддреНрд░реБрдЯрд┐ рд░рд┐рдХреЙрд░реНрдб рдЫреЛрдЯреЗ рдмреИрдЪ рдореЗрдВ рд▓рд╛рдЗрди рдирдВрдмрд░реЛрдВ рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░рддреЗ рд╣реИрдВ; рдмрд╣реБрдд рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ.

рд░рд┐рдПрдХреНрдЯ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдЧ рдХреА рд╕рдВрддрд░реА рджреВрд░рд╕реНрде рдирд┐рдЧрд░рд╛рдиреА

рд╕реЗрдВрдЯреНрд░реА рд╕реЗрд╡рд╛ рддреНрд░реБрдЯрд┐ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдХрдо рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдорд╛рдирдЪрд┐рддреНрд░ рдЦреАрдВрдЪрдХрд░ рдЗрд╕реЗ рд╕рдордЭрд╛рддреА рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рд╕реЗ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ (рд╕реЗрдВрдЯреНрд░реА рд╕реЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рдкрд╣реБрдВрдЪ рдпреЛрдЧреНрдп рдирд╣реАрдВ)ред

рд╕рдорд╛рдзрд╛рди (рд╕реНрд░реЛрдд рдорд╛рдирдЪрд┐рддреНрд░)

рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд╡реЗрдм рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдЪрд▓рд╛рдирд╛ рд╣реИред GitHub рдкреЗрдЬ рд╕реЗрд╡рд╛ (рдирд┐рдГрд╢реБрд▓реНрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЙрддреНрддрд░ рдмрдЯрдиред рдЙрдкрдпреЛрдЧ рдХреЗ рдЪрд░рдг рдЖрдорддреМрд░ рдкрд░ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:

  1. рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЙрдкреА рдХрд░реЗрдВ рдирд┐рд░реНрдорд╛рдг рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдбреЙрдХреНрд╕ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдХреА рдореВрд▓ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВред

  2. рдЪрд╛рд▓реВ рдХрд░реЗрдВ GitHub рдкреЗрдЬ рдбреЙрдХреНрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ (GitHub рд╕реЗ)ред рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рдУрдВ

  3. GitHub рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдкреБрд╢ рдХрд░реЗрдВ

рдиреЛрдЯ: рдЬрдм рдореБрдЭреЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдореБрдЭреЗ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ рдХреНрд░рд┐рдПрдЯ-рдХреНрд░рд┐рдПрдЯ-рдРрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реЛрдо рдкреЗрдЬ рдлрд╝рдВрдХреНрд╢рдиред рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛ package.json рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЖрдпрд╛:

"homepage": "https://larkintuckerllc.github.io/hello-sentry/"

рдЪрд▓ рд░рд╣реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдВ рдЙрдкрд▓рдмреНрдз рд╣реИ:

https://larkintuckerllc.github.io/hello-sentry/

рдкрдХрдбрд╝реЗ рдЧрдП рдХреАрдбрд╝реЛрдВ рдХрд╛ рдЪрд┐рддреНрд░рдг

рдЪрд▓рд┐рдП рд╣реЗрд▓реЛ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЪрд▓рддреЗ рд╣реИрдВред

рд░рд┐рдПрдХреНрдЯ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдЧ рдХреА рд╕рдВрддрд░реА рджреВрд░рд╕реНрде рдирд┐рдЧрд░рд╛рдиреА

рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде:

рд░рд┐рдПрдХреНрдЯ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдЧ рдХреА рд╕рдВрддрд░реА рджреВрд░рд╕реНрде рдирд┐рдЧрд░рд╛рдиреА

рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ:

  • рдпрд╣ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реЛ рд╕рдХреА, рдмреНрд░рд╛рд╡реЛ.

рдмреЗрд╣рд┐рд╕рд╛рдм рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдЪрд┐рддреНрд░рдг

рдЗрд╕реА рддрд░рд╣, рдЪрд▓рд┐рдП рдмрдЯрди рдХреНрд▓рд┐рдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд▓рддреЗ рд╣реИрдВ рддреНрд░реБрдЯрд┐.

рд░рд┐рдПрдХреНрдЯ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдЧ рдХреА рд╕рдВрддрд░реА рджреВрд░рд╕реНрде рдирд┐рдЧрд░рд╛рдиреА

рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреЗ рд╡рд╛рд▓реА рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде:

рд░рд┐рдПрдХреНрдЯ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдЧ рдХреА рд╕рдВрддрд░реА рджреВрд░рд╕реНрде рдирд┐рдЧрд░рд╛рдиреА

рдмреЗрд╣рд┐рд╕рд╛рдм рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рдмреЗрд╣рддрд░ рдкреНрд░рдмрдВрдзрди (рдкреНрд░рддрд┐рдкрд╛рджрди)

рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛ рдХрд╛ рдкрд░рд┐рдЪрдп

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╣рд┐рд╕реНрд╕реЗ рдореЗрдВ рдПрдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐ рд╕реЗ рд╕рдВрдкреВрд░реНрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд╛рдзрд┐рдд рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рд░рд┐рдПрдХреНрдЯ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд░рд┐рдПрдХреНрдЯ 16 "рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛" рдирд╛рдордХ рдПрдХ рдирдИ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреЗрд╢ рдХрд░рддрд╛ рд╣реИред

рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛рдПрдБ рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рд╣реИрдВ рдЬреЛ рдЕрдкрдиреЗ рдЪрд╛рдЗрд▓реНрдб рдШрдЯрдХ рдЯреНрд░реА рдореЗрдВ рдХрд╣реАрдВ рднреА рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ, рдЙрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рд▓реЙрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рджреБрд░реНрдШрдЯрдирд╛рдЧреНрд░рд╕реНрдд рдШрдЯрдХ рдЯреНрд░реА рдХреЗ рдмрдЬрд╛рдп рдлрд╝реЙрд▓рдмреИрдХ рдпреВрдЖрдИ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВред рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛рдПрдБ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди, рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдФрд░ рдЙрдирдХреЗ рдиреАрдЪреЗ рдкреВрд░реЗ рдкреЗрдбрд╝ рдХреЗ рдХрдВрд╕реНрдЯреНрд░рдХреНрдЯрд░реНрд╕ рдореЗрдВ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рддреА рд╣реИрдВред

...

рдЕрдЬреНрдЮрд╛рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирдпрд╛ рд╡реНрдпрд╡рд╣рд╛рд░

рдпрд╣ рдмрджрд▓рд╛рд╡ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ. рд░рд┐рдПрдХреНрдЯ 16 рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдЬреЛ рддреНрд░реБрдЯрд┐рдпрд╛рдБ рдХрд┐рд╕реА рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛ рджреНрд╡рд╛рд░рд╛ рдирд╣реАрдВ рдкрдХрдбрд╝реА рдЧрдИрдВ, рдЙрдирдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрдкреВрд░реНрдг рд░рд┐рдПрдХреНрдЯ рдШрдЯрдХ рдЯреНрд░реА рдЕрдирдорд╛рдЙрдВрдЯ рд╣реЛ рдЬрд╛рдПрдЧрд╛ред

- рдбреИрди рдЕрдмреНрд░рд╛рдореЛрд╡ - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16 рдореЗрдВ рддреНрд░реБрдЯрд┐ рдкреНрд░рдмрдВрдзрди

рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореБрдЭреЗ рдПрд╣рд╕рд╛рд╕ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рд╕рдордп рд▓рдЧрд╛ рд╡рд╣ рдпрд╣ рд╣реИ рдЙрдкрд░реЛрдХреНрдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗрд╡рд▓ рд░реЗрдВрдбрд░ рд╡рд┐рдзрд┐ рдореЗрдВ рдЙрддреНрдкрдиреНрди рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ (рдпрд╛ рдХрд┐рд╕реА рднреА рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐ рдореЗрдВ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ). рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рд╣рдорд╛рд░реЗ рдмрдЯрди рдХрд╛ рдХреЛрдИ рднрд▓рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ рддреНрд░реБрдЯрд┐; рдпрд╣ рддреНрд░реБрдЯрд┐ рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдереА.

рдЖрдЗрдП рд░реЗрдВрдбрд░ рдПрд░рд░ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдПрдВ рдФрд░ рдлрд┐рд░ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдзрд┐рдХ рдЦреВрдмрд╕реВрд░рддреА рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрд░рд░ рдмрд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк/src/MyRenderError

import React, { Component } from 'react';

export default class MyRenderError extends Component {
  state = {
    flag: false,
  };
  render() {
    const { flag } = this.state;
    return (
      <div>
        <button
          onClick={this.handleClick}
        >
          Render Error
        </button>
        { flag && <div>{flag.busted.bogus}</div> }
      </div>
    )
  }

  handleClick = () => {
    this.setState({
      flag: true,
    });
  }
}

рдирд┐рд░реАрдХреНрд╖рдг:

  • рдЬрдм рдЖрдк рдмрдЯрди рджрдмрд╛рддреЗ рд╣реИрдВ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЭрдВрдбрд╛.рдкрд░реНрджрд╛рдлрд╛рд╢.рдлрд░реНрдЬреА, рдЬреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ

  • рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛ рдХреЗ рдмрд┐рдирд╛, рд╕рдВрдкреВрд░реНрдг рдШрдЯрдХ рд╡реГрдХреНрд╖ рдЕрдирдорд╛рдЙрдВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛

рдлрд┐рд░ рд╣рдо рдЕрдкрдирд╛ рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛ рдХреЛрдб рд▓рд┐рдЦрддреЗ рд╣реИрдВ (рдирдИ рдЬреАрд╡рдирдЪрдХреНрд░ рдкрджреНрдзрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдХрдВрдкреЛрдиреЗрдВрдЯрдбрд┐рдбрдХреИрдЪ); рдпрд╣ рдореВрд▓рддрдГ рдбреИрди рдЕрдмреНрд░рд╛рдореЛрд╡ рдХреЗ рд▓реЗрдЦ рдореЗрдВ рджрд┐рдпрд╛ рдЧрдпрд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ:

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк/src/ErrorBoundary.js

import React, { Component } from 'react';
import * as Sentry from '@sentry/browser';

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

  componentDidCatch(err, info) {
    this.setState({ hasError: true });
    Sentry.captureException(err);
  }

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

рдЕрдВрдд рдореЗрдВ рд╣рдо рдЗрд╕ рдШрдЯрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:

рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рдРрдк/src/App.js

...
import MyRenderError from './MyRenderError';

class App extends Component {
  render() {
    return (
      <ErrorBoundary>
        <div className="App">
          ...
        </div>
      </ErrorBoundary>
    );
  }
}
...

рд╣рд╛рд▓рд╛рдБрдХрд┐, рд░реЗрдВрдбрд░ рдПрд░рд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рд╕реЗ рдлрд╝реЙрд▓рдмреИрдХ рдпреВрдЖрдИ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕реЗрдВрдЯреНрд░реА рдХреЛ рдПрдХ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рд╣реЛрддреА рд╣реИред

рд░рд┐рдПрдХреНрдЯ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдЧ рдХреА рд╕рдВрддрд░реА рджреВрд░рд╕реНрде рдирд┐рдЧрд░рд╛рдиреА

рд░рд┐рдПрдХреНрдЯ рдлреНрд░рдВрдЯрдПрдВрдб рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмрдЧ рдХреА рд╕рдВрддрд░реА рджреВрд░рд╕реНрде рдирд┐рдЧрд░рд╛рдиреА

рд╕рдорд╛рдкрди

рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдпрд╣ рдЙрдкрдпреЛрдЧреА рд▓рдЧрд╛ рд╣реЛрдЧрд╛ред

рдкреБрдирд╢реНрдЪ рдореВрд▓ рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВ

рд╕реЗрдВрдЯреНрд░реА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреАрдПрд╕ рдЯреЗрд▓реАрдЧреНрд░рд╛рдо рдЪреИрдЯ https://t.me/sentry_ru

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ