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

рд╣рд╛рдореА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдХреЛ рд╕рд╛рде Sentry рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрдиреНрд╡реЗрд╖рдг рдЧрд░реНрджреИрдЫреМрдВред

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

рдпреЛ рд▓реЗрдЦ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕реЗрдиреНрдЯреНрд░реА рддреНрд░реБрдЯрд┐рд╣рд░реВ рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░реНрди рд╕реБрд░реБ рд╣реБрдиреЗ рд╢реНрд░реГрдВрдЦрд▓рд╛рдХреЛ рдЕрдВрд╢ рд╣реЛ: 1 рднрд╛рдЧ.

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

рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореАрд▓реЗ рдпреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рд╕реЗрдиреНрдЯреНрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдердкреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ; рд╕реЗрдиреНрдЯреНрд░реА рд╡реЗрдмрд╕рд╛рдЗрдЯрдмрд╛рдЯред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЫрд╛рдиреНрдЫреМрдВред

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

npx create-react-app react-app

рддреНрдпрд╕рдкрдЫрд┐ рд╣рд╛рдореА рд╕реЗрдиреНрдЯреНрд░реА рдкреНрдпрд╛рдХреЗрдЬ рдЖрдпрд╛рдд рдЧрд░реНрдЫреМрдВ:

yarn add @sentry/browser

рд░ рдпрд╕рд▓рд╛рдИ рдкреНрд░рд╛рд░рдореНрдн рдЧрд░реНрдиреБрд╣реЛрд╕реН:

react-app/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,
  });
}
...

рдЕрд╡рд▓реЛрдХрдирд╣рд░реВ:

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

рдЕрд░реНрдХреЛ рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рд╣реЗрд▓реЛ рд░ рддреНрд░реБрдЯрд┐ рдмрдЯрдирд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрдЫреМрдВ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рдердкреНрдЫреМрдВ:

react-app/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);
    }
  }
}

react-app/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');
  }
}

react-app/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/

рд╕рдорд╛рддрд┐рдПрдХрд╛ рдмрдЧрд╣рд░реВрдХреЛ рдЪрд┐рддреНрд░рдг

рдирдорд╕реНрддреЗ рдмрдЯрди рдХреНрд▓рд┐рдХ рдЧрд░реЗрд░ рд╣рд┐рдВрдбреМрдВред

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

рдпрд╕ рдкреНрд░рдХрд╛рд░ рджреЗрдЦрд┐рдиреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрдЧ:

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

рдЕрд╡рд▓реЛрдХрдирд╣рд░реВ:

  • рдпреЛ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рд╕реНрдкрд╖реНрдЯ рд╣реБрди рд╕рдХреЗрди, рдФрдВрдареА.

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

рддреНрдпрд╕реНрддреИ рдЧрд░реА, рдмрдЯрди рдХреНрд▓рд┐рдХ рдорд╛рд░реНрдлрдд рдЬрд╛рдФрдВ рддреНрд░реБрдЯрд┐.

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

рдпрд╕ рдкреНрд░рдХрд╛рд░ рджреЗрдЦрд┐рдиреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрдЧ:

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

рдмреЗрд╣рд┐рд╕рд╛рдм рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рд░рд╛рдореНрд░реЛ рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдЩ (рд░реЗрдиреНрдбрд░рд┐рдЩ)

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

рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдиреНрдЯрд░рдлреЗрд╕рдХреЛ рднрд╛рдЧрдорд╛ JavaScript рддреНрд░реБрдЯрд┐рд▓реЗ рд╕рдореНрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рддреЛрдбреНрдиреБ рд╣реБрдБрджреИрдиред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16 рд▓реЗ "рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛" рднрдирд┐рдиреЗ рдирдпрд╛рдБ рдЕрд╡рдзрд╛рд░рдгрд╛ рдкреНрд░рд╕реНрддреБрдд рдЧрд░реНрджрдЫред

рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛рд╣рд░реВ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрд╣рд░реВ рд╣реБрдиреН рдЬрд╕рд▓реЗ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдЙрдиреАрд╣рд░реВрдХреЛ рдмрд╛рд▓ рдХрдореНрдкреЛрдиреЗрдиреНрдЯ рдЯреНрд░реАрдорд╛ рдХрд╣реАрдВ рдкрдирд┐ рд╕рдорд╛рддреНрдЫрдиреН, рддреА рддреНрд░реБрдЯрд┐рд╣рд░реВ рд▓рдЧрд╛рдЙрдБрдЫрдиреН, рд░ рдХреНрд░реНрдпрд╛рд╕ рднрдПрдХреЛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯ рд░реВрдЦрдХреЛ рд╕рдЯреНрдЯрд╛ рдлрд▓рдмреНрдпрд╛рдХ UI рд░реЗрдиреНрдбрд░ рдЧрд░реНрджрдЫред рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛рд╣рд░реВ рд░реЗрдиреНрдбрд░рд┐рдЩрдХреЛ рд╕рдордпрдорд╛, рдЬреАрд╡рдирдЪрдХреНрд░ рд╡рд┐рдзрд┐рд╣рд░реВрдорд╛, рд░ рддрд┐рдиреАрд╣рд░реВрдХреЛ рддрд▓ рд╕рдореНрдкреВрд░реНрдг рд░реВрдЦрдХреЛ рдирд┐рд░реНрдорд╛рдгрдХрд░реНрддрд╛рд╣рд░реВрдорд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВ рд╕рдорд╛рддреНрдЫрдиреНред

...

рдкрддреНрддрд╛ рдирд▓рд╛рдЧреЗрдХрд╛ рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рд╡реНрдпрд╡рд╣рд╛рд░

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

- рджрд╛рди рдЕрдмреНрд░рд╛рдореЛрдн - рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 16 рдорд╛ рддреНрд░реБрдЯрд┐ рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдВрдЧ

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

рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рд░реЗрдиреНрдбрд░рд┐рдЩ рддреНрд░реБрдЯрд┐ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ рд░ рддреНрдпрд╕рдкрдЫрд┐ рддреНрд░реБрдЯрд┐рд▓рд╛рдИ рдЕрдЭ рд░рд╛рдореНрд░реЛрд╕рдБрдЧ рд╣реНрдпрд╛рдиреНрдбрд▓ рдЧрд░реНрди рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВред

react-app/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,
    });
  }
}

рдЕрд╡рд▓реЛрдХрди:

  • рдмрдЯрди рдерд┐рдЪреНрджрд╛, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реБрдиреЗрдЫ flag.busted.bogus, рдЬрд╕рд▓реЗ рддреНрд░реБрдЯрд┐ рдЙрддреНрдкрдиреНрди рдЧрд░реНрдЫ

  • рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛ рдмрд┐рдирд╛, рд╕рдореНрдкреВрд░реНрдг рдШрдЯрдХ рд░реВрдЦ рдЕрдирдорд╛рдЙрдиреНрдЯ рд╣реБрдиреЗрдЫ

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

react-app/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;
  }
}

рдЕрдиреНрддрдорд╛ рд╣рд╛рдореА рдпреЛ рдШрдЯрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ:

react-app/src/App.js

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

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

рдпрджреНрдпрдкрд┐, рд░реЗрдиреНрдбрд░ рдПрд░рд░ рдмрдЯрдирдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрджрд╛ рдлрд▓рдмреНрдпрд╛рдХ UI рджреЗрдЦрд╛рдЙрдБрдЫ рд░ рд╕реЗрдиреНрдЯреНрд░реАрдорд╛ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░реНрдЫред

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

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

рд╕рдорд╛рдкреНрддрд┐

рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдЙрдкрдпреЛрдЧреА рдкрд╛рдЙрдиреБрднрдпреЛред

PS рдореВрд▓ рд▓рд┐рдЩреНрдХ

рд╕реЗрдиреНрдЯреНрд░реА рдорд╛рд░реНрдлрдд PS рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдЪреНрдпрд╛рдЯ https://t.me/sentry_ru

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди