āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĢā§āĻ°āĻ¨ā§āĻŸāĻāĻ¨ā§āĻĄ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦāĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻŋ āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ

āĻ†āĻŽāĻ°āĻž āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻ¸āĻš 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 āĻĨā§‡āĻ•ā§‡) āĻĄāĻ•ā§āĻ¸ āĻĢā§‹āĻ˛ā§āĻĄāĻžāĻ°āĻŸāĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻŽāĻžāĻ˛āĻŋāĻ• āĻļāĻžāĻ–āĻž

  3. GitHub āĻ āĻĒāĻ°āĻŋāĻŦāĻ°ā§āĻ¤āĻ¨āĻ—ā§āĻ˛āĻŋ āĻĒā§āĻļ āĻ•āĻ°ā§āĻ¨

āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯: āĻ†āĻŽāĻŋ āĻ•āĻŋ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¤āĻž āĻŦā§‡āĻ° āĻ•āĻ°āĻžāĻ° āĻĒāĻ°ā§‡ āĻ¤ā§ˆāĻ°āĻŋ-āĻ¤ā§ˆāĻ°āĻŋ-āĻ…ā§āĻ¯āĻžāĻĒ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ āĻšāĻžāĻ˛ā§ āĻ•āĻ°āĻ¤ā§‡ āĻšā§‹āĻŽ āĻĒā§‡āĻœ āĻĢāĻžāĻ‚āĻļāĻ¨āĨ¤ package.json-āĻ āĻ¨āĻŋāĻŽā§āĻ¨āĻ˛āĻŋāĻ–āĻŋāĻ¤ āĻ¯ā§‹āĻ— āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨ā§‡āĻŽā§‡ āĻāĻ¸ā§‡āĻ›āĻŋ:

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

āĻšāĻ˛āĻŽāĻžāĻ¨ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨ā§‡āĻ° āĻšā§‚āĻĄāĻŧāĻžāĻ¨ā§āĻ¤ āĻ¸āĻ‚āĻ¸ā§āĻ•āĻ°āĻŖ āĻāĻ–āĻžāĻ¨ā§‡ āĻ‰āĻĒāĻ˛āĻŦā§āĻ§:

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

āĻ§āĻ°āĻž āĻĒāĻĄāĻŧāĻž āĻŦāĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻĻā§ƒāĻˇā§āĻŸāĻžāĻ¨ā§āĻ¤

āĻšā§āĻ¯āĻžāĻ˛ā§‹ āĻŦā§‹āĻ¤āĻžāĻŽā§‡ āĻ•ā§āĻ˛āĻŋāĻ• āĻ•āĻ°ā§‡ āĻšāĻ˛ā§āĻ¨āĨ¤

āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĢā§āĻ°āĻ¨ā§āĻŸāĻāĻ¨ā§āĻĄ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦāĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻŋ āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ

āĻāĻ‡ āĻŽāĻ¤ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻāĻ•āĻŸāĻŋ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¸āĻ™ā§āĻ—ā§‡:

āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĢā§āĻ°āĻ¨ā§āĻŸāĻāĻ¨ā§āĻĄ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦāĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻŋ āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ

āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ:

  • āĻāĻ‡ āĻŦāĻžāĻ— āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻĒāĻ°āĻŋāĻˇā§āĻ•āĻžāĻ° āĻšāĻ¤ā§‡ āĻĒāĻžāĻ°ā§‡ āĻ¨āĻž, āĻŦāĻ˛āĻŋāĻšāĻžāĻ°āĻŋ.

āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ° āĻœāĻ¨ā§āĻ¯ āĻšāĻŋāĻ¸āĻžāĻŦāĻšā§€āĻ¨ā§‡āĻ° āĻšāĻŋāĻ¤ā§āĻ°

āĻ…āĻ¨ā§āĻ°ā§‚āĻĒāĻ­āĻžāĻŦā§‡, āĻāĻ° āĻŦāĻžāĻŸāĻ¨ āĻ•ā§āĻ˛āĻŋāĻ• āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻ¯āĻžāĻ¨ āĻ­ā§āĻ˛.

āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĢā§āĻ°āĻ¨ā§āĻŸāĻāĻ¨ā§āĻĄ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦāĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻŋ āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ

āĻāĻ‡ āĻŽāĻ¤ āĻĒā§āĻ°āĻĻāĻ°ā§āĻļāĻŋāĻ¤ āĻāĻ•āĻŸāĻŋ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¸āĻ™ā§āĻ—ā§‡:

āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĢā§āĻ°āĻ¨ā§āĻŸāĻāĻ¨ā§āĻĄ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦāĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻŋ āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ

āĻšāĻŋāĻ¸āĻžāĻŦāĻŦāĻŋāĻšā§€āĻ¨ āĻ¤ā§āĻ°ā§āĻŸāĻŋāĻ—ā§āĻ˛āĻŋāĻ° āĻ†āĻ°āĻ“ āĻ­āĻžāĻ˛ āĻĒāĻ°āĻŋāĻšāĻžāĻ˛āĻ¨āĻž (āĻ°ā§‡āĻ¨ā§āĻĄāĻžāĻ°āĻŋāĻ‚)

āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¸ā§€āĻŽāĻž āĻĒāĻ°āĻŋāĻšāĻŋāĻ¤āĻŋ

āĻ‡āĻ‰āĻœāĻžāĻ° āĻ‡āĻ¨ā§āĻŸāĻžāĻ°āĻĢā§‡āĻ¸ā§‡āĻ° āĻāĻ•āĻŸāĻŋ āĻ…āĻ‚āĻļā§‡ āĻāĻ•āĻŸāĻŋ āĻœāĻžāĻ­āĻžāĻ¸ā§āĻ•ā§āĻ°āĻŋāĻĒā§āĻŸ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ¸āĻŽāĻ—ā§āĻ° āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻŸāĻŋ āĻ­āĻžāĻ™ā§āĻ—āĻž āĻ‰āĻšāĻŋāĻ¤ āĻ¨āĻ¯āĻŧāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ°āĻ•āĻžāĻ°ā§€āĻĻā§‡āĻ° āĻœāĻ¨ā§āĻ¯ āĻāĻ‡ āĻ¸āĻŽāĻ¸ā§āĻ¯āĻžāĻŸāĻŋ āĻ¸āĻŽāĻžāĻ§āĻžāĻ¨ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯, āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž 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 āĻĻā§‡āĻ–āĻžāĻ¯āĻŧ āĻāĻŦāĻ‚ āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻŋāĻ•ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¤ā§āĻ°ā§āĻŸāĻŋ āĻ°āĻŋāĻĒā§‹āĻ°ā§āĻŸ āĻ•āĻ°ā§‡āĨ¤

āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĢā§āĻ°āĻ¨ā§āĻŸāĻāĻ¨ā§āĻĄ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦāĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻŋ āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ

āĻĒā§āĻ°āĻ¤āĻŋāĻ•ā§āĻ°āĻŋāĻ¯āĻŧāĻž āĻĢā§āĻ°āĻ¨ā§āĻŸāĻāĻ¨ā§āĻĄ āĻ…ā§āĻ¯āĻžāĻĒā§āĻ˛āĻŋāĻ•ā§‡āĻļāĻ¨āĻ—ā§āĻ˛āĻŋāĻ¤ā§‡ āĻŦāĻžāĻ—āĻ—ā§āĻ˛āĻŋāĻ° āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻŋ āĻĻā§‚āĻ°āĻŦāĻ°ā§āĻ¤ā§€ āĻĒāĻ°ā§āĻ¯āĻŦā§‡āĻ•ā§āĻˇāĻŖ

āĻĒāĻ°āĻŋāĻĒā§‚āĻ°āĻŖ

āĻ†āĻŽāĻŋ āĻ†āĻļāĻž āĻ•āĻ°āĻŋ āĻ†āĻĒāĻ¨āĻŋ āĻāĻ‡ āĻ¸āĻšāĻžāĻ¯āĻŧāĻ• āĻĒāĻžāĻ“āĻ¯āĻŧāĻž āĻ—ā§‡āĻ›ā§‡.

āĻĻā§āĻ°āĻˇā§āĻŸāĻŦā§āĻ¯ āĻŽā§‚āĻ˛ āĻ˛āĻŋāĻ™ā§āĻ•

āĻ¸ā§‡āĻ¨ā§āĻŸā§āĻ°āĻŋāĻ° āĻŽāĻžāĻ§ā§āĻ¯āĻŽā§‡ āĻĒāĻŋāĻāĻ¸ āĻŸā§‡āĻ˛āĻŋāĻ—ā§āĻ°āĻžāĻŽ āĻšā§āĻ¯āĻžāĻŸ https://t.me/sentry_ru

āĻ‰āĻ¤ā§āĻ¸: www.habr.com

āĻāĻ•āĻŸāĻŋ āĻŽāĻ¨ā§āĻ¤āĻŦā§āĻ¯ āĻœā§āĻĄāĻŧā§āĻ¨