เชฐเชฟเชเช•เซเชŸ เชซเซเชฐเชจเซเชŸเชเชจเซเชก เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชฎเชพเช‚ เชฌเช—เซเชธเชจเซเช‚ เชธเซ‡เชจเซเชŸเซเชฐเซ€ เชฐเชฟเชฎเซ‹เชŸ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช—

เช…เชฎเซ‡ เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชธเชพเชฅเซ‡ 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 เชฎเชพเช‚ เชซเซ‡เชฐเชซเชพเชฐเซ‹เชจเซ‡ เชฆเชฌเชพเชฃ เช•เชฐเซ‹

เชจเซ‹เช‚เชงเชฃเซ€: เชฎเชพเชฐเซ‡ เชถเซเช‚ เชตเชพเชชเชฐเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ เชคเซ‡ เชธเชฎเชœเซเชฏเชพ เชชเช›เซ€ เชฌเชจเชพเชตเซ‹-เชฌเชจเชพเชตเซ‹-เชเชช เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ เชถเชฐเซ‚ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชนเซ‹เชฎ เชชเซ‡เชœ เชซเช‚เช•เซเชถเชจ. เชชเซ‡เช•เซ‡เชœ.เชœเซ‡เชธเชจเชฎเชพเช‚ เชจเซ€เชšเซ‡เชจเชพ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชจเซ€เชšเซ‡ เช†เชตเซเชฏเชพ:

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

เชšเชพเชฒเซ€ เชฐเชนเซ‡เชฒ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซเช‚ เช…เช‚เชคเชฟเชฎ เชธเช‚เชธเซเช•เชฐเชฃ เช…เชนเซ€เช‚ เช‰เชชเชฒเชฌเซเชง เช›เซ‡:

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

เชชเช•เชกเชพเชฏเซ‡เชฒ เชฌเช—เซเชธเชจเซเช‚ เชšเชฟเชคเซเชฐเชฃ

เชšเชพเชฒเซ‹ เชนเซ‡เชฒเซ‹ เชฌเชŸเชจ เชชเชฐ เช•เซเชฒเชฟเช• เช•เชฐเซ€เชจเซ‡ เช†เช—เชณ เชตเชงเซ€เช.

เชฐเชฟเชเช•เซเชŸ เชซเซเชฐเชจเซเชŸเชเชจเซเชก เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชฎเชพเช‚ เชฌเช—เซเชธเชจเซเช‚ เชธเซ‡เชจเซเชŸเซเชฐเซ€ เชฐเชฟเชฎเซ‹เชŸ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช—

เช†เชจเซ€ เชœเซ‡เชฎ เชฆเซ‡เช–เชพเชคเซ€ เชญเซ‚เชฒ เชธเชพเชฅเซ‡:

เชฐเชฟเชเช•เซเชŸ เชซเซเชฐเชจเซเชŸเชเชจเซเชก เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชฎเชพเช‚ เชฌเช—เซเชธเชจเซเช‚ เชธเซ‡เชจเซเชŸเซเชฐเซ€ เชฐเชฟเชฎเซ‹เชŸ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช—

เช…เชตเชฒเซ‹เช•เชจเซ‹:

  • เช† เชฌเช— เชฐเชฟเชชเซ‹เชฐเซเชŸ เชธเซเชชเชทเซเชŸ เชฅเชˆ เชถเช•เซเชฏเซ‹ เชจเชฅเซ€, BRAVO.

เชญเซ‚เชฒเซ‹ เชฎเชพเชŸเซ‡ เชฌเชฟเชจเชนเชฟเชธเชพเชฌเซ€เชจเซเช‚ เชšเชฟเชคเซเชฐ

เชคเซ‡เชตเซ€ เชœ เชฐเซ€เชคเซ‡, เชšเชพเชฒเซ‹ เชฌเชŸเชจ เช•เซเชฒเชฟเช• เช•เชฐเซ€เชจเซ‡ เชœเชˆเช เชญเซ‚เชฒ.

เชฐเชฟเชเช•เซเชŸ เชซเซเชฐเชจเซเชŸเชเชจเซเชก เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชฎเชพเช‚ เชฌเช—เซเชธเชจเซเช‚ เชธเซ‡เชจเซเชŸเซเชฐเซ€ เชฐเชฟเชฎเซ‹เชŸ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช—

เช†เชจเซ€ เชœเซ‡เชฎ เชฆเซ‡เช–เชพเชคเซ€ เชญเซ‚เชฒ เชธเชพเชฅเซ‡:

เชฐเชฟเชเช•เซเชŸ เชซเซเชฐเชจเซเชŸเชเชจเซเชก เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซเชธเชฎเชพเช‚ เชฌเช—เซเชธเชจเซเช‚ เชธเซ‡เชจเซเชŸเซเชฐเซ€ เชฐเชฟเชฎเซ‹เชŸ เชฎเซ‹เชจเชฟเชŸเชฐเชฟเช‚เช—

เชฌเชฟเชจเชนเชฟเชธเชพเชฌเซ€ เชญเซ‚เชฒเซ‹เชจเซเช‚ เชฌเชนเซ‡เชคเชฐ เชธเช‚เชšเชพเชฒเชจ (เชฐเซ‡เชจเซเชกเชฐเซ€เช‚เช—)

เชญเซ‚เชฒ เชฎเชฐเซเชฏเชพเชฆเชพเชจเซ‹ เชชเชฐเชฟเชšเชฏ

เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพ เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชจเชพ เชญเชพเช—เชฎเชพเช‚ JavaScript เชญเซ‚เชฒ เชธเชฎเช—เซเชฐ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชคเซ‹เชกเซ€ เชจ เชถเช•เซ‡. React เชฏเซเชเชฐเซเชธ เชฎเชพเชŸเซ‡ เช† เชธเชฎเชธเซเชฏเชพเชจเซ‡ เช‰เช•เซ‡เชฒเชตเชพ เชฎเชพเชŸเซ‡, React 16 "เชเชฐเชฐ เชฌเชพเช‰เชจเซเชกเซเชธ" เชจเชพเชฎเชจเซ‹ เชจเชตเซ‹ เช•เซ‹เชจเซเชธเซ‡เชชเซเชŸ เชฐเชœเซ‚ เช•เชฐเซ‡ เช›เซ‡.

เชญเซ‚เชฒเชจเซ€ เชธเซ€เชฎเชพเช“ เช เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช˜เชŸเช•เซ‹ เช›เซ‡ เชœเซ‡ เชคเซ‡เชฎเชจเชพ เชฌเชพเชณ เช˜เชŸเช• เชตเซƒเช•เซเชทเชฎเชพเช‚ เช—เชฎเซ‡ เชคเซเชฏเชพเช‚ JavaScript เชญเซ‚เชฒเซ‹ เชชเช•เชกเซ‡ เช›เซ‡, เชคเซ‡ เชญเซ‚เชฒเซ‹เชจเซ‡ เชฒเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เช•เซเชฐเซ‡เชถ เชฅเชฏเซ‡เชฒเชพ เช˜เชŸเช• เชตเซƒเช•เซเชทเชจเซ‡ เชฌเชฆเชฒเซ‡ เชซเซ‹เชฒเชฌเซ‡เช• 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,
    });
  }
}

เช…เชตเชฒเซ‹เช•เชจ:

  • เชœเซเชฏเชพเชฐเซ‡ เชคเชฎเซ‡ เชฌเชŸเชจ เชฆเชฌเชพเชตเซ‹ เช›เซ‹, เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชฆเชฐเซเชถเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เชซเซเชฒเซ‡เช—.เชฌเชธเซเชŸเซเชก.เชฌเซ‹เช—เชธ, เชœเซ‡ เชญเซ‚เชฒ เชœเชจเชฐเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡

  • เชญเซ‚เชฒเชจเซ€ เชธเซ€เชฎเชพ เชตเชฟเชจเชพ, เชธเชฎเช—เซเชฐ เช˜เชŸเช• เชตเซƒเช•เซเชทเชจเซ‡ เช…เชจเชฎเชพเช‰เชจเซเชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡

เชชเช›เซ€ เช…เชฎเซ‡ เช…เชฎเชพเชฐเซ‹ เชเชฐเชฐ เชฌเชพเช‰เชจเซเชกเซเชฐเซ€ เช•เซ‹เชก เชฒเช–เซ€เช เช›เซ€เช (เชจเชตเซ€ เชœเซ€เชตเชจเชšเช•เซเชฐ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ 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 เชฎเซ‚เชณ เชธเชพเชฅเซ‡ เชฒเชฟเช‚เช•

เชธเช‚เชคเซเชฐเซ€ เชฆเซเชตเชพเชฐเชพ เชชเซ€เชเชธ เชŸเซ‡เชฒเชฟเช—เซเชฐเชพเชฎ เชšเซ‡เชŸ https://t.me/sentry_ru

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹