ืกืขื ื˜ืจื™ ื•ื•ื™ื™ึทื˜ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืจืขืึทืงื˜ ืคืจืึธื ื˜ืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ืžื™ืจ ื•ื™ืกืคืึธืจืฉืŸ ื ื™ืฆืŸ Sentry ืžื™ื˜ React.

ืกืขื ื˜ืจื™ ื•ื•ื™ื™ึทื˜ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืจืขืึทืงื˜ ืคืจืึธื ื˜ืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ื“ืขืจ ืึทืจื˜ื™ืงืœ ืื™ื– ื˜ื™ื™ืœ ืคื•ืŸ ืึท ืกืขืจื™ืข ืกื˜ืึทืจื˜ื™ื ื’ ืžื™ื˜ ืจื™ืคึผืึธืจื˜ื™ื ื’ ืกืขื ื˜ืจื™ ืขืจืจืึธืจืก ื ื™ืฆืŸ ืึท ื‘ื™ื™ืฉืคึผื™ืœ: ะงะฐัั‚ัŒ ืงืกื ื•ืžืงืก.

ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ืจืขืึทืงื˜

ืขืจืฉื˜ืขืจ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ืœื™ื™ื’ืŸ ืึท ื ื™ื™ึทืข ืกืขื ื˜ืจื™ ืคึผืจื•ื™ืขืงื˜ ืคึฟืึทืจ ื“ืขื ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ; ืคื•ืŸ ื“ื™ Sentry ื•ื•ืขื‘ื–ื™ื™ื˜ืœ. ืื™ืŸ ื“ืขื ืคืึทืœ, ืžื™ืจ ืงืœื™ื™ึทื‘ืŸ React.

ืžื™ืจ ื•ื•ืขืœืŸ ืฉื™ื™ึทืขืš-ื™ืžืคึผืœืขืžืขื ื˜ ืื•ื ื“ื–ืขืจ ืฆื•ื•ื™ื™ ืงื ืขืคึผืœืขืš, ื”ืขืœื ืื•ืŸ ื˜ืขื•ืช, ืื™ืŸ ืึท ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืžื™ื˜ ืจืขืึทืงื˜. ืžื™ืจ ืึธื ื”ื™ื™ื‘ืŸ ืžื™ื˜ ืงืจื™ื™ื™ื˜ื™ื ื’ ืื•ื ื“ื–ืขืจ ืกื˜ืึทืจื˜ืขืจ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ:

npx create-react-app react-app

ื“ืขืจื ืึธืš ืžื™ืจ ืึทืจื™ื™ึทื ืคื™ืจ ื“ื™ Sentry ืคึผืขืงืœ:

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

ื‘ืืžืขืจืงื•ื ื’ืขืŸ:

  • ื‘ืขืฉืึทืก ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’, ืžื™ืจ ื”ืึธื‘ืŸ ืื ื“ืขืจืข ืžืขืงืึทื ื™ื–ืึทืžื– ืคึฟืึทืจ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ื™ืฉื•ื–, ืึทื–ืึท ื•ื•ื™ ื“ื™ ืงืึทื ืกืึธื•ืœ, ืึทื–ื•ื™ ืžื™ืจ ื ืึธืจ ื’ืขื‘ืŸ Sentry ืคึฟืึทืจ ืคึผืจืึธื“ื•ืงืฆื™ืข ื‘ื•ื™ืขืŸ.

ื“ืขืจื ืึธืš ืžื™ืจ ื™ื ืกื˜ืจื•ืžืขื ื˜ ืื•ื ื“ื–ืขืจ ื”ืขืœื ืื•ืŸ ื˜ืขื•ืช ืงื ืขืคึผืœืขืš ืื•ืŸ ืœื™ื™ื’ืŸ ื–ื™ื™ ืฆื• ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ:

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;

ืคึผืจืึธื‘ืœืขื (ืžืงื•ืจ ืžืึทืคึผืก)

ืžื™ืจ ืงืขื ืขืŸ ืคึผืจื•ื‘ื™ืจืŸ Sentry ืžื™ื˜ ืึท ืคึผืจืึธื“ื•ืงืฆื™ืข ื‘ื•ื™ืขืŸ ื“ื•ืจืš ืึทืจื™ื™ึทืŸ:

yarn build

ืื•ืŸ ืคึฟื•ืŸ ื“ื™ ื‘ื•ื™ืขืŸ ื˜ืขืงืข ืึทืจื™ื™ึทืŸ:

npx http-server -c-1

ื“ืขืจ ืคึผืจืึธื‘ืœืขื ื•ื•ืึธืก ืžื™ืจ ืžื™ื“ ืœื•ื™ืคืŸ ืื™ืŸ ืื™ื– ืึทื– Sentry ืก ื˜ืขื•ืช ืจืขืงืึธืจื“ืก ืึธืคึผืฉื™ืงืŸ ืฆื• ืฉื•ืจื” ื ื•ืžืขืจืŸ ืื™ืŸ ื“ื™ ืžื™ื ื™ืคื™ืขื“ ืคึผืขืงืœ; ื ื™ื˜ ื–ื™ื™ืขืจ ื ื•ืฆื™ืง.

ืกืขื ื˜ืจื™ ื•ื•ื™ื™ึทื˜ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืจืขืึทืงื˜ ืคืจืึธื ื˜ืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ื“ื™ ืกืขื ื˜ืจื™ ืกืขืจื•ื•ื™ืก ื“ืขืจืงืœืขืจื˜ ื“ืขื ื“ื•ืจืš ืฆื™ืขืŸ ื“ื™ ืžืงื•ืจ ืžืึทืคึผืก ืคึฟืึทืจ ื“ื™ ืจื™ื“ื•ืกื˜ ืคึผืึทืงืึทื˜ ื ืึธืš ื‘ืืงื•ืžืขืŸ ืึท ื˜ืขื•ืช. ืื™ืŸ ื“ืขื ืคืึทืœ, ืžื™ืจ ืœื•ื™ืคืŸ ืคึฟื•ืŸ ืœืึธืงืึทืœื”ืึธืกื˜ (ื ื™ื˜ ืฆื•ื˜ืจื™ื˜ืœืขืš ื“ื•ืจืš ื“ื™ Sentry ื“ื™ื ืกื˜).

ืกืึทืœื•ืฉืึทื ื– (ืžืงื•ืจ ืžืึทืคึผืก)

ื“ื™ ืœื™ื™ื–ื•ื ื’ ืฆื• ื“ืขื ืคึผืจืึธื‘ืœืขื ืื™ื– ืฆื• ืœื•ื™ืคืŸ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืคึฟื•ืŸ ืึท ืฆื™ื‘ื•ืจ ื•ื•ืขื‘ ืกืขืจื•ื•ืขืจ. ืื™ื™ืŸ ืคึผืฉื•ื˜ ืขื ื˜ืคืขืจ ืงื ืขืคึผืœ ืฆื• ื ื•ืฆืŸ ื“ื™ GitHub ื‘ืœืขื˜ืขืจ ื“ื™ื ืกื˜ (ืคืจื™ื™). ื“ื™ ืกื˜ืขืคึผืก ืฆื• ื ื•ืฆืŸ ื–ืขื ืขืŸ ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื•ื•ื™ ื’ื™ื™ื˜:

  1. ื ืึธื›ืžืึทื›ืŸ ื“ื™ ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ ื˜ืขืงืข ื‘ื•ื™ืขืŸ ืฆื• ื˜ืขืงืข ื“ืึธืงืก ืื™ืŸ ื“ื™ ื•ื•ืึธืจืฆืœ ื•ื•ืขื’ื•ื•ื™ื™ึทื–ืขืจ ืคื•ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™.

  2. ืฆื™ื ื“ ืืŸ ื’ื™ื˜ื”ื•ื‘ ื‘ืœืขื˜ืขืจ ืื™ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ (ืคึฟื•ืŸ GitHub) ืฆื• ื ื•ืฆืŸ ื“ื™ ื“ืึธืงืก ื˜ืขืงืข ืื™ืŸ ื‘ืึทืœืขื‘ืึธืก ืฆื•ื•ื™ื™ื’ืŸ

  3. ืคึผื•ืฉ ืขื ื“ืขืจื•ื ื’ืขืŸ ืฆื• GitHub

ื˜ืึธืŸ: ื ืึธืš ืื™ืš ืคื™ื’ื™ืขืจื“ ืื•ื™ืก ื•ื•ืึธืก ืื™ืš ื“ืึทืจืคึฟืŸ ืฆื• ื ื•ืฆืŸ ืฉืึทืคึฟืŸ-ืฉืึทืคึฟืŸ-ืึทืคึผ ื”ื™ื™ื ื‘ืœืึทื˜ ืคื•ื ืงืฆื™ืข ืฆื• ืงืึทื˜ืขืจ ื“ื™ ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ื’ืขืงื•ืžืขืŸ ืฆื• ืœื™ื™ื’ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืฆื• package.json:

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

ื“ื™ ืœืขืฆื˜ ื•ื•ืขืจืกื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ื“ื™ ืคืœื™ืกื ื“ื™ืง ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ ืื™ื– ื‘ื ื™ืžืฆื ืื™ืŸ:

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

ืื™ืœื•ืกื˜ืจืืฆื™ืข ืคื•ืŸ โ€‹โ€‹ืงืึทื˜ ื‘ืึทื’ื–

ื–ืืœ ืก ื’ื™ื™ืŸ ื“ื•ืจืš ื’ืขื‘ืŸ ืึท ืงืœื™ืง ื“ืขื ื”ืขืœื ืงื ืขืคึผืœ.

ืกืขื ื˜ืจื™ ื•ื•ื™ื™ึทื˜ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืจืขืึทืงื˜ ืคืจืึธื ื˜ืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ืžื™ื˜ ืึท ื˜ืขื•ืช ื“ืขืจืฉื™ื™ึทื ืขืŸ ื•ื•ื™ ื“ืึธืก:

ืกืขื ื˜ืจื™ ื•ื•ื™ื™ึทื˜ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืจืขืึทืงื˜ ืคืจืึธื ื˜ืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ื‘ืืžืขืจืงื•ื ื’ืขืŸ:

  • ื“ืขืจ ื–ืฉื•ืง ื‘ืืจื™ื›ื˜ ืงืขืŸ ื ื™ืฉื˜ ื–ื™ื™ืŸ ืงืœืืจืขืจ, ื’ื•ื˜ ื’ืขื˜ืืŸ.

ื™ืœืœื•ืกื˜ืจืึทื˜ื™ืึธืŸ ืคื•ืŸ ืึทื ืึทืงืึทื•ื ื˜ืขื“ ืคึฟืึทืจ ืขืจืจืึธืจืก

ืคึผื•ื ืงื˜ ืึทื–ื•ื™, ืœืึธื–ืŸ ืก ื’ื™ื™ืŸ ื“ื•ืจืš ื“ื™ ืงื ืขืคึผืœ ื’ื™ื˜ ื˜ืขื•ืช.

ืกืขื ื˜ืจื™ ื•ื•ื™ื™ึทื˜ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืจืขืึทืงื˜ ืคืจืึธื ื˜ืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ืžื™ื˜ ืึท ื˜ืขื•ืช ื“ืขืจืฉื™ื™ึทื ืขืŸ ื•ื•ื™ ื“ืึธืก:

ืกืขื ื˜ืจื™ ื•ื•ื™ื™ึทื˜ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืจืขืึทืงื˜ ืคืจืึธื ื˜ืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ื‘ืขืกืขืจ ื”ืึทื ื“ืœื™ื ื’ ืคื•ืŸ ืึทื ืึทืงืึทื•ื ื˜ื™ื“ ืขืจืจืึธืจืก (ืจืขื ื“ืขืจื™ื ื’)

ื”ืงื“ืžื” ืคื•ืŸ ื˜ืขื•ืช ืœื™ืžืึทืฅ

ื ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ื˜ืขื•ืช ืื™ืŸ ื˜ื™ื™ืœ ืคื•ืŸ ื“ื™ ื‘ืึทื ื™ืฆืขืจ ืฆื•ื‘ื™ื ื“ ื–ืึธืœ ื ื™ืฉื˜ ื‘ืจืขื›ืŸ ื“ื™ ื’ืื ืฆืข ืึทืคึผืœืึทืงื™ื™ืฉืึทืŸ. ืฆื• ืกืึธืœื•ื•ืข ื“ืขื ืคึผืจืึธื‘ืœืขื ืคึฟืึทืจ ืจืขืึทืงื˜ ื™ื•ื–ืขืจื–, React 16 ื™ื ื˜ืจืึทื“ื•ืกื™ื– ืึท ื ื™ื™ึทืข ื‘ืึทื’ืจื™ืฃ ื’ืขืจื•ืคึฟืŸ "ื˜ืขื•ืช ื’ื•ื•ื•ืœ".

ื˜ืขื•ืช ื‘ืึทื•ื ื“ืจื™ื– ื–ืขื ืขืŸ ืจืขืึทืงื˜ ืงืึทืžืคึผืึธื•ื ืึทื ืฅ ื•ื•ืึธืก ื›ืึทืคึผืŸ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ืขืจืจืึธืจืก ืขืจื’ืขืฅ ืื™ืŸ ื–ื™ื™ืขืจ ืงื™ื ื“ ืงืึธืžืคึผืึธื ืขื ื˜ ื‘ื•ื™ื, ืงืœืึธืฅ ื“ื™ ืขืจืจืึธืจืก ืื•ืŸ ืžืึทื›ืŸ ืึท ืคืึทืœื‘ืึทืงืง ื•ื™ ืึทื ืฉื˜ืึธื˜ ืคื•ืŸ ื“ื™ ืงืึธืžืคึผืึธื ืขื ื˜ ื‘ื•ื™ื ื•ื•ืึธืก ืงืจืึทืฉื˜. ื˜ืขื•ืช ื‘ืึทื•ื ื“ืจื™ื– ื›ืึทืคึผืŸ ืขืจืจืึธืจืก ื‘ืขืฉืึทืก ืจืขื ื“ืขืจื™ื ื’, ืื™ืŸ ืœื™ื™ืคืกื™ื™ืงืึทืœ ืžืขื˜ื”ืึธื“ืก, ืื•ืŸ ืื™ืŸ ื“ื™ ืงืึทื ืกื˜ืจืึทืงื˜ืขืจื– ืคื•ืŸ ื“ื™ ื’ืื ืฆืข ื‘ื•ื™ื ืื•ื ื˜ืขืจ ื–ื™ื™.

...

ื ื™ื• ืึธืคึผืคื™ืจื•ื ื’ ืคึฟืึทืจ ืึทื ื“ื™ื˜ืขืงื˜ื™ื“ ืขืจืจืึธืจืก

ื“ืขื ืขื ื“ืขืจื•ื ื’ ืื™ื– ื‘ืึทื˜ื™ื™ึทื˜ื™ืง. ื–ื™ื ื˜ ืจืขืึทืงื˜ 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,
    });
  }
}

ื‘ืืžืขืจืงื•ื ื’:

  • ื•ื•ืขืŸ ืื™ืจ ื“ืจื™ืงืŸ ื“ืขื ืงื ืขืคึผืœ, React ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื•ื•ื™ื–ืŸ 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>
    );
  }
}
...

ืึธื‘ืขืจ, ืงืœื™ืงื™ื ื’ ืื•ื™ืฃ ื“ื™ ืจืขื ื“ืขืจืขืจ ื˜ืขื•ืช ืงื ืขืคึผืœ ื“ื™ืกืคึผืœื™ื™ื– ื“ื™ ืคืึทืœื‘ืึทืงืง ื•ื™ ืื•ืŸ ืจื™ืคึผืึธืจืฅ ืึท ื˜ืขื•ืช ืฆื• Sentry.

ืกืขื ื˜ืจื™ ื•ื•ื™ื™ึทื˜ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืจืขืึทืงื˜ ืคืจืึธื ื˜ืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ืกืขื ื˜ืจื™ ื•ื•ื™ื™ึทื˜ ืžืึธื ื™ื˜ืึธืจื™ื ื’ ืคื•ืŸ ื‘ืึทื’ื– ืื™ืŸ ืจืขืึทืงื˜ ืคืจืึธื ื˜ืขื ื“ ืึทืคึผืœืึทืงื™ื™ืฉืึทื ื–

ืงืึทืžืคึผืœื™ืฉืึทืŸ

ืื™ืš ื”ืึธืคึฟืŸ ืื™ืจ ื’ืขืคึฟื•ื ืขืŸ ื“ืขื ื ื•ืฆื™ืง.

ืคึผืก ืœื™ื ืง ืฆื• ืึธืจื™ื’ื™ื ืขืœ

ืคึผืก ื˜ืขืœืขื’ืจืึทื ืฉืžื•ืขืกืŸ ื“ื•ืจืš ืกืขื ื˜ืจื™ https://t.me/sentry_ru

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’