เจฐเจฟเจเจ•เจŸ เจซเจฐเฉฐเจŸเจเจ‚เจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฌเฉฑเจ—เจพเจ‚ เจฆเฉ€ เจธเฉฐเจคเจฐเฉ€ เจฐเจฟเจฎเฉ‹เจŸ เจจเจฟเจ—เจฐเจพเจจเฉ€

เจ…เจธเฉ€เจ‚ Sentry with React เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเฉœเจšเฉ‹เจฒ เจ•เจฐ เจฐเจนเฉ‡ เจนเจพเจ‚เฅค

เจฐเจฟเจเจ•เจŸ เจซเจฐเฉฐเจŸเจเจ‚เจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฌเฉฑเจ—เจพเจ‚ เจฆเฉ€ เจธเฉฐเจคเจฐเฉ€ เจฐเจฟเจฎเฉ‹เจŸ เจจเจฟเจ—เจฐเจพเจจเฉ€

เจ‡เจน เจฒเฉ‡เจ– เจ‡เฉฑเจ• เจ‰เจฆเจพเจนเจฐเจจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจธเฉฐเจคเจฐเฉ€ เจ—เจฒเจคเฉ€เจ†เจ‚ เจฆเฉ€ เจฐเจฟเจชเฉ‹เจฐเจŸ เจ•เจฐเจจ เจจเจพเจฒ เจธเจผเฉเจฐเฉ‚ เจนเฉ‹เจฃ เจตเจพเจฒเฉ€ เจฒเฉœเฉ€ เจฆเจพ เจนเจฟเฉฑเจธเจพ เจนเฉˆ: 1 เจฆเจพ เจนเจฟเฉฑเจธเจพ.

เจชเฉเจฐเจคเฉ€เจ•เจฟเจฐเจฟเจ† เจจเฉ‚เฉฐ เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ

เจชเจนเจฟเจฒเจพเจ‚ เจธเจพเจจเฉ‚เฉฐ เจ‡เจธ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฒเจˆ เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจธเฉฐเจคเจฐเฉ€ เจชเฉเจฐเฉ‹เจœเฉˆเจ•เจŸ เจœเฉ‹เฉœเจจ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ; เจธเฉฐเจคเจฐเฉ€ เจตเฉˆเจฌเจธเจพเจˆเจŸ เจคเฉ‹เจ‚. เจ‡เจธ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš เจ…เจธเฉ€เจ‚ React เจจเฉ‚เฉฐ เจšเฉเจฃเจฆเฉ‡ เจนเจพเจ‚เฅค

เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ เจฆเฉ‹ เจฌเจŸเจจเจพเจ‚, เจนเฉˆเจฒเฉ‹ เจ…เจคเฉ‡ เจเจฐเจฐ เจจเฉ‚เฉฐ เจฐเฉ€เจเจ•เจŸ เจฆเฉ‡ เจจเจพเจฒ เจ‡เฉฑเจ• เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจตเจฟเฉฑเจš เจฆเฉเจฌเจพเจฐเจพ เจฒเจพเจ—เฉ‚ เจ•เจฐเจพเจ‚เจ—เฉ‡เฅค เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ€ เจธเจŸเจพเจฐเจŸเจฐ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจฌเจฃเจพ เจ•เฉ‡ เจธเจผเฉเจฐเฉ‚ เจ•เจฐเจฆเฉ‡ เจนเจพเจ‚:

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/

เจซเฉœเฉ‡ เจ—เจ เจฌเฉฑเจ—เจพเจ‚ เจฆเจพ เจ‰เจฆเจพเจนเจฐเจจ

เจ†เจ‰ เจนเฉˆเจฒเฉ‹ เจฌเจŸเจจ เจคเฉ‡ เจ•เจฒเจฟเจ• เจ•เจฐเจ•เฉ‡ เจšเฉฑเจฒเฉ€เจเฅค

เจฐเจฟเจเจ•เจŸ เจซเจฐเฉฐเจŸเจเจ‚เจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฌเฉฑเจ—เจพเจ‚ เจฆเฉ€ เจธเฉฐเจคเจฐเฉ€ เจฐเจฟเจฎเฉ‹เจŸ เจจเจฟเจ—เจฐเจพเจจเฉ€

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจฃ เจตเจพเจฒเฉ€ เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจฆเฉ‡ เจจเจพเจฒ:

เจฐเจฟเจเจ•เจŸ เจซเจฐเฉฐเจŸเจเจ‚เจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฌเฉฑเจ—เจพเจ‚ เจฆเฉ€ เจธเฉฐเจคเจฐเฉ€ เจฐเจฟเจฎเฉ‹เจŸ เจจเจฟเจ—เจฐเจพเจจเฉ€

เจจเจฟเจฐเฉ€เจ–เจฃ:

  • เจ‡เจน เจฌเฉฑเจ— เจฐเจฟเจชเฉ‹เจฐเจŸ เจธเจชเฉฑเจธเจผเจŸ เจจเจนเฉ€เจ‚ เจนเฉ‹ เจธเจ•เฉ€, เจฌเจฐเจพเจตเฉ‹.

เจ—เจฒเจคเฉ€เจ†เจ‚ เจฒเจˆ เจฌเฉ‡-เจนเจฟเจธเจพเจฌ เจฆเจพ เจ‰เจฆเจพเจนเจฐเจจ

เจ‡เจธเฉ‡ เจคเจฐเฉเจนเจพเจ‚, เจ†เจ“ เจฌเจŸเจจ เจ•เจฒเจฟเฉฑเจ• เจฐเจพเจนเฉ€เจ‚ เจœเจพเจฃเฉ€เจ เจ—เจฒเจคเฉ€ เจนเฉˆ.

เจฐเจฟเจเจ•เจŸ เจซเจฐเฉฐเจŸเจเจ‚เจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฌเฉฑเจ—เจพเจ‚ เจฆเฉ€ เจธเฉฐเจคเจฐเฉ€ เจฐเจฟเจฎเฉ‹เจŸ เจจเจฟเจ—เจฐเจพเจจเฉ€

เจ‡เจธ เจคเจฐเฉเจนเจพเจ‚ เจฆเจฟเจ–เจพเจˆ เจฆเฉ‡เจฃ เจตเจพเจฒเฉ€ เจ‡เฉฑเจ• เจ—เจฒเจคเฉ€ เจฆเฉ‡ เจจเจพเจฒ:

เจฐเจฟเจเจ•เจŸ เจซเจฐเฉฐเจŸเจเจ‚เจก เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจเจพเจ‚ เจตเจฟเฉฑเจš เจฌเฉฑเจ—เจพเจ‚ เจฆเฉ€ เจธเฉฐเจคเจฐเฉ€ เจฐเจฟเจฎเฉ‹เจŸ เจจเจฟเจ—เจฐเจพเจจเฉ€

เจฌเฉ‡เจนเจฟเจธเจพเจฌ เจ—เจฒเจคเฉ€เจ†เจ‚ เจฆเจพ เจฌเจฟเจนเจคเจฐ เจชเฉเจฐเจฌเฉฐเจงเจจ (เจฐเฉˆเจ‚เจกเจฐเจฟเฉฐเจ—)

เจ—เจฒเจคเฉ€ เจธเฉ€เจฎเจพเจตเจพเจ‚ เจฆเฉ€ เจœเจพเจฃ-เจชเจ›เจพเจฃ

เจฏเฉ‚เจœเจผเจฐ เจ‡เฉฐเจŸเจฐเจซเฉ‡เจธ เจฆเฉ‡ เจนเจฟเฉฑเจธเฉ‡ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• JavaScript เจ—เจฒเจคเฉ€ เจจเฉ‚เฉฐ เจชเฉ‚เจฐเฉ€ เจเจชเจฒเฉ€เจ•เฉ‡เจธเจผเจจ เจจเฉ‚เฉฐ เจจเจนเฉ€เจ‚ เจคเฉ‹เฉœเจจเจพ เจšเจพเจนเฉ€เจฆเจพ เจนเฉˆเฅค React เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฒเจˆ เจ‡เจธ เจธเจฎเฉฑเจธเจฟเจ† เจจเฉ‚เฉฐ เจนเฉฑเจฒ เจ•เจฐเจจ เจฒเจˆ, React 16 เจ‡เฉฑเจ• เจจเจตเจพเจ‚ เจธเฉฐเจ•เจฒเจช เจชเฉ‡เจธเจผ เจ•เจฐเจฆเจพ เจนเฉˆ เจœเจฟเจธเจจเฉ‚เฉฐ "error bounds" เจ•เจฟเจนเจพ เจœเจพเจ‚เจฆเจพ เจนเฉˆเฅค

เจ—เจฒเจคเฉ€ เจธเฉ€เจฎเจพเจตเจพเจ‚ เจ‰เจน เจชเฉเจฐเจคเฉ€เจ•เจฟเจฐเจฟเจ† เจตเจพเจฒเฉ‡ เจญเจพเจ— เจนเจจ เจœเฉ‹ เจ†เจชเจฃเฉ‡ เจšเจพเจˆเจฒเจก เจ•เฉฐเจชเฉ‹เจจเฉˆเจ‚เจŸ เจŸเฉเจฐเฉ€ เจตเจฟเฉฑเจš เจ•เจฟเจคเฉ‡ เจตเฉ€ 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,
    });
  }
}

เจจเจฟเจฐเฉ€เจ–เจฃ:

  • เจœเจฆเฉ‹เจ‚ เจคเฉเจธเฉ€เจ‚ เจฌเจŸเจจ เจฆเจฌเจพเจ‰เจ‚เจฆเฉ‡ เจนเฉ‹, เจชเฉเจฐเจคเฉ€เจ•เจฟเจฐเจฟเจ† เจชเฉเจฐเจฆเจฐเจธเจผเจฟเจค เจ•เฉ€เจคเจพ เจœเจพเจตเฉ‡เจ—เจพ 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

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹