เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเต† เดคเดคเตเดธเดฎเดฏ เดชเดฟเดถเด•เต เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด‡เดจเตเดจเต เดžเดพเตป เดจเดฟเด™เตเด™เดณเต‹เดŸเต เดชเดฑเดฏเตเด‚. เด’เดฐเต เดซเตเดฐเดฃเตเดŸเต-เดŽเตปเดกเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดธเดพเดงเดพเดฐเดฃเดฏเดพเดฏเดฟ เดชเดฟเดถเด•เต เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เดฟเดจเดพเดฏเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดฑเดฟเดฒเตเดฒ. เดšเดฟเดฒ เด•เดฎเตเดชเดจเดฟเด•เตพ เดชเดฒเดชเตเดชเต‹เดดเตเด‚ เดฌเด—เต เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เต เดฎเดพเดฑเตเดฑเดฟเดตเดฏเตเด•เตเด•เตเด•เดฏเตเด‚ เดกเต‹เด•เตเดฏเตเดฎเต†เดจเตเดฑเต‡เดทเตป, เดŸเต†เดธเตเดฑเตเดฑเตเด•เตพ เดฎเตเดคเดฒเดพเดฏเดตเดฏเตเด•เตเด•เต เดถเต‡เดทเด‚ เด…เดคเดฟเดฒเต‡เด•เตเด•เต เดฎเดŸเด™เตเด™เตเด•เดฏเตเด‚ เดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, เดจเดฟเด™เตเด™เดณเตเดŸเต† เด‰เตฝเดชเตเดชเดจเตเดจเด‚ เดฎเดฟเด•เดšเตเดš เดฐเต€เดคเดฟเดฏเดฟเตฝ เดฎเดพเดฑเตเดฑเดพเตป เด•เดดเดฟเดฏเตเดฎเต†เด™เตเด•เดฟเตฝ, เด…เดคเต เดšเต†เดฏเตเดฏเตเด•!

1. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดŽเดจเตเดคเตเด•เตŠเดฃเตเดŸเต เดธเต†เตปเดŸเตเดฐเดฟ เด†เดตเดถเตเดฏเดฎเดพเดฃเต?

เดจเดฟเตผเดฎเตเดฎเดพเดฃ เดธเดฎเดฏเดคเตเดคเต เดฌเด—เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเต†เดจเตเดจเต เดžเดพเตป เด•เดฐเตเดคเตเดจเตเดจเต

เด‡เดคเต เดฎเดคเดฟเดฏเดพเด•เดฟเดฒเตเดฒเต†เดจเตเดจเต เดจเดฟเด™เตเด™เตพ เด•เดฐเตเดคเตเดจเตเดจเตเดฃเตเดŸเต‹?

เดถเดฐเดฟ, เดจเดฎเตเด•เตเด•เต เดตเดฟเดถเดฆเดพเด‚เดถเด™เตเด™เตพ เดจเต‹เด•เตเด•เดพเด‚.

เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดชเตเดฐเดงเดพเดจ เด•เดพเดฐเดฃเด™เตเด™เตพ:

  • เดชเดฟเดถเด•เตเด•เดณเตเดณเตเดณ เด•เต‹เดกเต เดตเดฟเดจเตเดฏเดธเดฟเด•เตเด•เตเดฎเตเดชเต‹เตพ เด…เดชเด•เดŸเดธเดพเดงเตเดฏเดคเด•เตพ เด’เดดเดฟเดตเดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต
  • เด•เต‹เดกเต เดชเดฐเดฟเดถเต‹เดงเดจเดฏเดฟเตฝ QA-เดฏเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเด•
  • เดชเตเดฐเดถเตเดจเด™เตเด™เดณเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เดชเต†เดŸเตเดŸเต†เดจเตเดจเตเดณเตเดณ เด…เดฑเดฟเดฏเดฟเดชเตเดชเตเด•เตพ เดธเตเดตเต€เด•เดฐเดฟเด•เตเด•เตเด•
  • เดชเดฟเดถเด•เตเด•เตพ เดตเต‡เด—เดคเตเดคเดฟเตฝ เดคเดฟเดฐเตเดคเตเดคเดพเดจเตเดณเตเดณ เด•เดดเดฟเดตเต
  • เด…เดกเตโ€Œเดฎเดฟเตป เดชเดพเดจเดฒเดฟเตฝ เดชเดฟเดถเด•เตเด•เดณเตเดŸเต† เดธเต—เด•เดฐเตเดฏเดชเตเดฐเดฆเดฎเดพเดฏ เดกเดฟเดธเตเดชเตเดฒเต‡ เดฒเดญเดฟเด•เตเด•เตเดจเตเดจเต
  • เด‰เดชเดฏเต‹เด•เตเดคเดพเดตเต/เดฌเตเดฐเต—เดธเตผ เดตเดฟเดญเดพเด—เดฎเดจเตเดธเดฐเดฟเดšเตเดšเต เดชเดฟเดถเด•เตเด•เตพ เด…เดŸเตเด•เตเด•เตเด•

เดธเดฟเด‡เด’/เดฒเต€เดกเต เดชเตเดฐเต‹เดœเด•เตเดŸเดฟเดจเตเดณเตเดณ เดชเตเดฐเดงเดพเดจ เด•เดพเดฐเดฃเด™เตเด™เตพ

  • เดชเดฃเด‚ เดฒเดพเดญเดฟเด•เตเด•เตเด• (เดธเต†เตปเดŸเตเดฐเดฟ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเตป เด•เดดเดฟเดฏเตเด‚)
  • เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดซเต€เดกเตเดฌเดพเด•เตเด•เต เดจเต‡เดŸเตเดจเตเดจเต
  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเตฝ เดŽเดจเตเดคเดพเดฃเต เดคเต†เดฑเตเดฑเต†เดจเตเดจเต เดคเดคเตเดธเดฎเดฏเด‚ เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต
  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดชเดฟเตฝ เด†เดณเตเด•เตพเด•เตเด•เต เดŽเดคเตเดฐ เดชเตเดฐเดถเตโ€Œเดจเด™เตเด™เดณเตเดฃเตเดŸเต†เดจเตเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เตเดจเตเดจเต
  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผ เดคเต†เดฑเตเดฑเตเด•เตพ เดตเดฐเตเดคเตเดคเดฟเดฏ เดธเตเดฅเดฒเด™เตเด™เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดพเตป เดจเดฟเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต

เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเตผเด•เตเด•เต เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เด†เดฆเตเดฏเด‚ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเดพเด•เตเดฎเต†เดจเตเดจเต เดžเดพเตป เด•เดฐเตเดคเตเดจเตเดจเต. เดธเต†เตปเดŸเตเดฐเดฟเดฏเต† เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเตเดŸเต† เดฌเต‹เดธเดฟเดจเต† เดฌเต‹เดงเตเดฏเดชเตเดชเต†เดŸเตเดคเตเดคเดพเตป เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เด•เดพเดฐเดฃเด™เตเด™เดณเตเดŸเต† เดชเดŸเตเดŸเดฟเด•เดฏเตเด‚ เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเด‚.

เดฌเดฟเดธเดฟเดจเดธเตเดธเต เดฒเดฟเดธเตเดฑเตเดฑเดฟเดฒเต† เด…เดตเดธเดพเดจ เด‡เดจเด‚ เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‡เดคเดฟเดจเด•เด‚ เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเต‹?

เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดŽเดจเตเดคเดพเดฃเต เดธเต†เตปเดŸเตเดฐเดฟ?

เด•เตเดฐเดพเดทเตเด•เตพ เดคเดคเตเดธเดฎเดฏเด‚ เดŸเตเดฐเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเดพเดจเตเด‚ เดชเดฐเดฟเดนเดฐเดฟเด•เตเด•เดพเดจเตเด‚ เดกเต†เดตเดฒเดชเตเดชเตผเดฎเดพเดฐเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เด“เดชเตเดชเตบ เดธเต‹เดดเตโ€Œเดธเต เดฌเด—เต เดŸเตเดฐเดพเด•เตเด•เดฟเด‚เด—เต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดพเดฃเต เดธเต†เตปเดŸเตเดฐเดฟ. เด•เดพเดฐเตเดฏเด•เตเดทเดฎเดค เดตเตผเดฆเตเดงเดฟเดชเตเดชเดฟเด•เตเด•เดพเดจเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เด…เดจเตเดญเดตเด‚ เดฎเต†เดšเตเดšเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดจเตเด‚ เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเตเดตเต†เดจเตเดจ เด•เดพเดฐเตเดฏเด‚ เดฎเดฑเด•เตเด•เดฐเตเดคเต. JavaScript, Node, Python, PHP, Ruby, Java เดŽเดจเตเดจเดฟเดตเดฏเตเด‚ เดฎเดฑเตเดฑเต เดชเตเดฐเต‹เด—เตเดฐเดพเดฎเดฟเด‚เด—เต เดญเดพเดทเด•เดณเตเด‚ เดธเต†เตปเดŸเตเดฐเดฟ เดชเดฟเดจเตเดคเตเดฃเดฏเตเด•เตเด•เตเดจเตเดจเต.

เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

2. เดฒเต‹เด—เดฟเตป เดšเต†เดฏเตเดคเต เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด•

  • เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเต†เตปเดŸเตเดฐเดฟ เด…เด•เตเด•เต—เดฃเตเดŸเต เดคเตเดฑเด•เตเด•เตเด•. เดจเดฟเด™เตเด™เตพ เดฒเต‹เด—เดฟเตป เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดฟ เดตเดจเตเดจเต‡เด•เตเด•เดพเด‚. (เดธเต†เตปเดŸเตเดฐเดฟ เดจเดฟเด™เตเด™เดณเตเดŸเต† เดธเต†เตผเดตเดฑเตเด•เดณเดฟเตฝ เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดพเดจเดพเด•เตเดฎเต†เดจเตเดจเดคเต เดถเตเดฐเดฆเตเดงเดฟเด•เตเด•เตเด•)
  • เด…เดŸเตเดคเตเดค เด˜เดŸเตเดŸเด‚ เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เตเด• เดŽเดจเตเดจเดคเดพเดฃเต
  • เดฒเดฟเดธเตเดฑเตเดฑเดฟเตฝ เดจเดฟเดจเตเดจเต เดจเดฟเด™เตเด™เดณเตเดŸเต† เดญเดพเดท เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เตเด•. (เดžเด™เตเด™เตพ เดชเตเดฐเดคเดฟเด•เดฐเดฃเด‚ เดคเดฟเดฐเดžเตเดžเต†เดŸเตเด•เตเด•เดพเตป เดชเต‹เด•เตเดจเตเดจเต. "เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเตƒเดทเตโ€ŒเดŸเดฟเด•เตเด•เตเด•" เด•เตเดฒเดฟเด•เตเด•เต เดšเต†เดฏเตเดฏเตเด•)

เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‡เดทเตเดŸเดพเดจเตเดธเตƒเดคเดฎเดพเด•เตเด•เตเด•. เด’เดฐเต เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเดฒเต‡เด•เตเด•เต เดธเต†เตปเดŸเตเดฐเดฟ เดŽเด™เตเด™เดจเต† เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเด•เตเด•เดพเด‚ เดŽเดจเตเดจเดคเดฟเดจเตเดฑเต† เด…เดŸเดฟเดธเตเดฅเดพเดจ เด‰เดฆเดพเดนเดฐเดฃเด‚ เดšเตเดตเดŸเต† เด•เดพเดฃเดพเด‚:

import * as Sentry from '@sentry/browser';
// Sentry.init({
//  dsn: "<https://[email protected]/1432138>"
// });
// should have been called before using it here
// ideally before even rendering your react app 

class ExampleBoundary extends Component {
    constructor(props) {
        super(props);
        this.state = { error: null };
    }

    componentDidCatch(error, errorInfo) {
      this.setState({ error });
      Sentry.withScope(scope => {
        Object.keys(errorInfo).forEach(key => {
          scope.setExtra(key, errorInfo[key]);
        });
        Sentry.captureException(error);
      });
    }

    render() {
        if (this.state.error) {
            //render fallback UI
            return (
              <a onClick={() => Sentry.showReportDialog()}>Report feedback</a>
            );
        } else {
            //when there's not an error, render children untouched
            return this.props.children;
        }
    }
}

เดจเดฟเด™เตเด™เตพ เด…เดŸเตเดคเตเดคเดคเดพเดฏเดฟ เดŽเดจเตเดคเดพเดฃเต เดšเต†เดฏเตเดฏเต‡เดฃเตเดŸเดคเต†เดจเตเดจเต เดฎเดจเดธเดฟเดฒเดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเต เดธเดนเดพเดฏเด•เดฎเดพเดฏ เด’เดฐเต เดตเดฟเดธเดพเตผเดกเต เดธเต†เตปเดŸเตเดฐเดฟเด•เตเด•เตเดฃเตเดŸเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เด˜เดŸเตเดŸเด™เตเด™เตพ เดชเดฟเดจเตเดคเตเดŸเดฐเดพเด‚. เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดฆเตเดฏเดคเตเดคเต† เดชเดฟเดถเด•เต เดนเดพเตปเดกเตโ€Œเดฒเตผ เดŽเด™เตเด™เดจเต† เดธเตƒเดทเตเดŸเดฟเด•เตเด•เดพเดฎเต†เดจเตเดจเต เดžเดพเตป เดจเดฟเด™เตเด™เดณเต† เด•เดพเดฃเดฟเด•เตเด•เดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต. เด•เตŠเดณเตเดณเดพเด‚, เดžเด™เตเด™เตพ เด’เดฐเต เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเต เดธเตƒเดทเตเดŸเดฟเดšเตเดšเต! เดจเดฎเตเด•เตเด•เต เด…เดŸเตเดคเตเดค เด˜เดŸเตเดŸเดคเตเดคเดฟเดฒเต‡เด•เตเด•เต เด•เดŸเด•เตเด•เดพเด‚

3. เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เตปเดกเต เดธเต†เตปเดŸเตเดฐเดฟ เด‡เดจเตเดฑเด—เตเดฐเต‡เดทเตป

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดชเตเดฐเต‹เดœเด•เตเดฑเตเดฑเดฟเตฝ เดจเดฟเด™เตเด™เตพ npm เดชเดพเด•เตเด•เต‡เดœเต เด‡เตปเดธเตเดฑเตเดฑเดพเตพ เดšเต†เดฏเตเดฏเดฃเด‚.

npm i @sentry/browser

เดจเดฟเด™เตเด™เดณเตเดŸเต† เด•เดฃเตเดŸเต†เดฏเตโ€Œเดจเดฑเดฟเตฝ เดธเต†เตปเดŸเตเดฐเดฟ เด†เดฐเด‚เดญเดฟเด•เตเด•เตเด•:

Sentry.init({
 // dsn: #dsnUrl,
});

เดชเตเดฐเต‹เดœเด•เตโ€Œเดฑเตเดฑเตเด•เตพ -> เด•เตเดฐเดฎเต€เด•เดฐเดฃเด™เตเด™เตพ -> เด•เตเดฒเดฏเดจเตเดฑเต เด•เต€เด•เดณเดฟเตฝ DSN เดธเตเดฅเดฟเดคเดฟเดšเต†เดฏเตเดฏเตเดจเตเดจเต. เดธเต†เตผเดšเตเดšเต เดฌเดพเดฑเดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด•เตเดฒเดฏเดจเตเดฑเต เด•เต€เด•เตพ เด•เดฃเตเดŸเต†เดคเตเดคเดพเด‚.

เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

componentDidCatch(error, errorInfo) {
  Sentry.withScope(scope => {
    Object.keys(errorInfo).forEach(key => {
      scope.setExtra(key, errorInfo[key]);
    });
    Sentry.captureException(error);
 });
}

4. เด†เดฆเตเดฏ เดชเดฟเดถเด•เต เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, Deezer API เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดžเดพเตป เด’เดฐเต เดฒเดณเดฟเดคเดฎเดพเดฏ เดธเด‚เด—เต€เดค เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต. เดจเดฟเด™เตเด™เตพเด•เตเด•เดคเต เด•เดพเดฃเดพเตป เด•เดดเดฟเดฏเตเด‚ เด‡เดตเดฟเดŸเต†. เดจเดฎเตเด•เตเด•เต เด’เดฐเต เดชเดฟเดถเด•เต เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต. "เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดพเดคเตเดค" เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟ เด†เด•เตเดธเดธเต เดšเต†เดฏเตเดฏเตเด• เดŽเดจเตเดจเดคเดพเดฃเต เด’เดฐเต เดตเดดเดฟ

เดžเด™เตเด™เตพ เดตเดฟเดณเดฟเด•เตเด•เตเดจเตเดจ เด’เดฐเต เดฌเดŸเตเดŸเตบ เดธเตƒเดทเตเดŸเดฟเด•เตเด•เต‡เดฃเตเดŸเดคเตเดฃเตเดŸเต console.log ั user.email. เดˆ เดชเตเดฐเดตเตผเดคเตเดคเดจเดคเตเดคเดฟเดจเต เดถเต‡เดทเด‚ เดžเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดชเดฟเดถเด•เต เดธเดจเตเดฆเต‡เดถเด‚ เดฒเดญเดฟเด•เตเด•เตเด‚: เดชเดฟเดŸเดฟเด•เตเด•เดชเตเดชเต†เดŸเดพเดคเตเดค เดŸเตˆเดชเตเดชเต เดชเดฟเดถเด•เต (เดจเดฟเตผเดตเดšเดฟเด•เตเด•เดพเดคเตเดคเดคเดฟเตฝ เดจเดฟเดจเตเดจเต เดชเตเดฐเต‹เดชเตเดชเตผเดŸเตเดŸเดฟ เดตเดพเดฏเดฟเด•เตเด•เดพเตป เด•เดดเดฟเดฏเดฟเดฒเตเดฒ email) เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดตเดธเตเดคเต เดจเดทเตโ€ŒเดŸเดฎเดพเดฏเดคเดฟเดจเดพเตฝ. เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเดจเตเด‚ เด•เดดเดฟเดฏเตเด‚ เดœเดพเดตเดพเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด’เดดเดฟเดตเดพเด•เตเด•เตฝ.

<button type="button" onClick={() => console.log(user.email)}>   
  Test Error button 
</button>

เดฎเตเดดเตเดตเตป เด•เดฃเตเดŸเต†เดฏเตเดจเดฑเตเด‚ เด‡เดคเตเดชเต‹เดฒเต† เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต:

import React, { Component } from "react";
import { connect } from "react-redux";
import { Input, List, Skeleton, Avatar } from "antd";
import * as Sentry from "@sentry/browser";
import getList from "../store/actions/getList";

const Search = Input.Search;

const mapState = state => ({
  list: state.root.list,
  loading: state.root.loading
});

const mapDispatch = {
  getList
};

class Container extends Component {
  constructor(props) {
    super(props);

    Sentry.init({
      dsn: "https://[email protected]/1417586",
    });
  }

  componentDidCatch(error, errorInfo) {
    Sentry.withScope(scope => {
      Object.keys(errorInfo).forEach(key => {
        scope.setExtra(key, errorInfo[key]);
      });
      Sentry.captureException(error);
    });
  }
  render() {
    const { list, loading, getList } = this.props;
    const user = undefined;
    return (
      <div className="App">
        <button
          type="button"
          onClick={() => console.log(user.email)}
        >
          test error1
        </button>
        <div onClick={() => Sentry.showReportDialog()}>Report feedback1</div>
        <h1>Music Finder</h1>
        <br />
        <Search onSearch={value => getList(value)} enterButton />
        {loading && <Skeleton avatar title={false} loading={true} active />}
        {!loading && (
          <List
            itemLayout="horizontal"
            dataSource={list}
            locale={{ emptyText: <div /> }}
            renderItem={item => (
              <List.Item>
                <List.Item.Meta
                  avatar={<Avatar src={item.artist.picture} />}
                  title={item.title}
                  description={item.artist.name}
                />
              </List.Item>
            )}
          />
        )}
      </div>
    );
  }
}

export default connect(
  mapState,
  mapDispatch
)(Container);

เดˆ เดฌเดŸเตเดŸเตบ เดธเด‚เดฏเต‹เดœเดฟเดชเตเดชเดฟเดšเตเดš เดถเต‡เดทเด‚, เดจเดฟเด™เตเด™เตพ เด‡เดคเต เดฌเตเดฐเต—เดธเดฑเดฟเตฝ เดชเดฐเต€เด•เตเดทเดฟเด•เตเด•เดฃเด‚.

เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดžเด™เตเด™เดณเตเดŸเต† เด†เดฆเตเดฏเดคเตเดคเต† เดคเต†เดฑเตเดฑเต เดžเด™เตเด™เตพเด•เตเด•เตเดฃเตเดŸเต

เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดนเต‚-เดนเต‚!

เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดจเดฟเด™เตเด™เตพ เดนเต†เดกเตผ เดชเดฟเดถเด•เดฟเตฝ เด•เตเดฒเดฟเด•เตเด•เต เดšเต†เดฏเตเดคเดพเตฝ, เดจเดฟเด™เตเด™เตพ เด’เดฐเต เดธเตเดฑเตเดฑเดพเด•เตเด•เต เดŸเตเดฐเต†เดฏเตเดธเต เด•เดพเดฃเตเด‚.

เดธเต†เตปเดŸเตเดฐเดฟ เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเตฝ เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เตเดšเต†เดฏเตเดฏเตเดจเตเดจเต

เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดฎเต‹เดถเดฎเดพเดฏเดฟ เด•เดพเดฃเดชเตเดชเต†เดŸเตเดจเตเดจเต. เด•เต‹เดกเต เดŽเดตเดฟเดŸเต†เดฏเดพเดฃเต†เดจเตเดจเต เดฎเดจเดธเตเดธเดฟเดฒเดพเด•เตเด•เดพเดคเต† เดชเดฟเดถเด•เต เดธเดจเตเดฆเต‡เดถเด™เตเด™เตพ เดžเด™เตเด™เตพ เด•เดฃเตเดŸเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เดธเตเดฅเดฟเดฐเดธเตเดฅเดฟเดคเดฟเดฏเดพเดฏเดฟ, ReactJS-เดฒเต† เดธเต‹เดดเตเดธเต เดฎเดพเดชเตเดชเดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเดพเดฃเต เดจเดฎเตเดฎเตพ เดธเด‚เดธเดพเดฐเดฟเด•เตเด•เตเดจเตเดจเดคเต, เด•เดพเดฐเดฃเด‚ เด…เดต เด•เต‹เตบเดซเดฟเด—เตผ เดšเต†เดฏเตเดคเดฟเดŸเตเดŸเดฟเดฒเตเดฒ.

เดธเต‹เดดเตโ€Œเดธเต เดฎเดพเดชเตเดชเต เดธเดœเตเดœเต€เด•เดฐเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เดจเดฟเตผเดฆเตเดฆเต‡เดถเด™เตเด™เตพ เดจเตฝเด•เดพเดจเตเด‚ เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต, เดชเด•เตเดทเต‡ เด…เดคเต เดˆ เดฒเต‡เด–เดจเดคเตเดคเต† เดžเดพเตป เด‰เดฆเตเดฆเต‡เดถเดฟเดšเตเดšเดคเดฟเดฒเตเด‚ เดตเดณเดฐเต† เดจเต€เดฃเตเดŸเดคเดพเด•เตเด•เตเด‚.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดˆ เดตเดฟเดทเดฏเด‚ เดชเด เดฟเด•เตเด•เดพเด‚ เด‡เดตเดฟเดŸเต†. เดˆ เดฒเต‡เด–เดจเดคเตเดคเดฟเตฝ เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดคเดพเตฝเดชเตเดชเดฐเตเดฏเดฎเตเดฃเตเดŸเต†เด™เตเด•เดฟเตฝ, เดฆเดฟเดฎเดฟเดคเตเดฐเดฟ เดจเต‹เดทเต†เด™เตเด•เต‹ เด‰เดฑเดตเดฟเดŸ เดญเต‚เดชเดŸ เดธเด‚เดฏเต‹เดœเดจเดคเตเดคเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเตเดณเตเดณ เดฐเดฃเตเดŸเดพเด‚ เดญเดพเด—เด‚ เดชเตเดฐเดธเดฟเดฆเตเดงเต€เด•เดฐเดฟเด•เตเด•เตเด‚. เด…เดคเดฟเดจเดพเตฝ, เด•เต‚เดŸเตเดคเตฝ เดฒเตˆเด•เตเด•เตเด•เตพ เด…เดŸเดฟเดšเตเดšเต เดธเดฌเตเดธเตเด•เตเดฐเตˆเดฌเต เดšเต†เดฏเตเดฏเตเด• เดฆเดฟเดฎเดฟเดคเตเดฐเดฟ เดจเต‹เดทเต†เด™เตเด•เต‹เดฐเดฃเตเดŸเดพเด‚ เดญเดพเด—เด‚ เดจเดทเตเดŸเดชเตเดชเต†เดŸเตเดคเตเดคเดพเดคเดฟเดฐเดฟเด•เตเด•เดพเตป.

5. เด‰เดชเดฏเต‹เด—เด‚ เดธเต†เดจเตเดฑเดฟ เด…เดตเดธเดพเดจ เดชเต‹เดฏเดฟเดจเตเดฑเตเดฎเดพเดฏเดฟ เดŽเดชเดฟเด

เดถเดฐเดฟ. เดฎเตเตป เด–เดฃเตเดกเดฟเด•เด•เดณเดฟเตฝ เดžเด™เตเด™เตพ เดœเดพเดตเดพเดธเตเด•เตเดฐเดฟเดชเตเดฑเตเดฑเต เด’เดดเดฟเดตเดพเด•เตเด•เตฝ เด‰เตพเดชเตเดชเต†เดŸเตเดคเตเดคเดฟเดฏเดฟเดŸเตเดŸเตเดฃเตเดŸเต. เดŽเดจเตเดจเดฟเดฐเตเดจเตเดจเดพเดฒเตเด‚, XHR เดชเดฟเดถเด•เตเด•เตพ เดธเด‚เดฌเดจเตเดงเดฟเดšเตเดšเต เดžเด™เตเด™เตพ เดŽเดจเตเดคเต เดšเต†เดฏเตเดฏเตเด‚?

เดธเต†เตปเดŸเตเดฐเดฟเด•เตเด•เต เด‡เดทเตโ€ŒเดŸเดพเดจเตเดธเตƒเดค เดชเดฟเดถเด•เต เด•เตˆเด•เดพเดฐเตเดฏเด‚ เดšเต†เดฏเตเดฏเดฒเตเด‚ เด‰เดฃเตเดŸเต. เดŽเดชเดฟเด เดชเดฟเดถเด•เตเด•เตพ เดŸเตเดฐเดพเด•เตเด•เต เดšเต†เดฏเตเดฏเดพเตป เดžเดพเตป เด‡เดคเต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต.

Sentry.captureException(err)

เดจเดฟเด™เตเด™เดณเตเดŸเต† เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเตป, เด‡เดฎเต†เดฏเดฟเตฝ เดฎเตเดคเดฒเดพเดฏเดต เด‰เดชเดฏเต‹เด—เดฟเดšเตเดšเต เดจเดฟเด™เตเด™เตพเด•เตเด•เต เดชเดฟเดถเด•เดฟเดจเตเดฑเต† เดชเต‡เดฐเต, เดฒเต†เดตเตฝ, เดกเดพเดฑเตเดฑ เดšเต‡เตผเด•เตเด•เตเด•, เด…เดฆเตเดตเดฟเดคเต€เดฏ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดกเดพเดฑเตเดฑ เดŽเดจเตเดจเดฟเดต เด‡เดทเตเดŸเดพเดจเตเดธเตƒเดคเดฎเดพเด•เตเด•เดพเดจเดพเด•เตเด‚.

superagent
  .get(`https://deezerdevs-deezer.p.rapidapi.com/search?q=${query}`)
  .set("X-RapidAPI-Key", #id_key)
  .end((err, response) => {
    if (err) {
      Sentry.configureScope(
        scope => scope
          .setUser({"email": "[email protected]"})
          .setLevel("Error")
      );
      return Sentry.captureException(err);
    }

    if (response) {
      return dispatch(setList(response.body.data));
    }
  });

เด•เตเดฏเดพเดšเตเดšเต API-เดฏเตโ€Œเด•เตเด•เดพเดฏเดฟ เด’เดฐเต เดœเดจเดฑเดฟเด•เต เดซเด‚เด—เตโ€Œเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดพเตป เดžเดพเตป เด†เด—เตเดฐเดนเดฟเด•เตเด•เตเดจเตเดจเต.

import * as Sentry from "@sentry/browser";

export const apiCatch = (error, getState) => {
  const store = getState();
  const storeStringify = JSON.stringify(store);
  const { root: { user: { email } } } = store;

  Sentry.configureScope(
    scope => scope
      .setLevel("Error")
      .setUser({ email })
      .setExtra("store", storeStringify)
  );
    // Sentry.showReportDialog(); - If you want get users feedback on error
  return Sentry.captureException(error);
};

เดจเดฟเด™เตเด™เดณเตเดŸเต† เดŽเดชเดฟเด เด•เต‹เดณเดฟเตฝ เดˆ เดซเด‚เด—เตโ€Œเดทเตป เด‡เดฎเตเดชเต‹เตผเดŸเตเดŸเตเดšเต†เดฏเตเดฏเตเด•.

export default query => (dispatch, getState) => {
  superagent
    .get(`https://deezerdevs-deezer.p.rapidapi.com/search?q=${query}`)
    .set("X-RapidAPI-Key", #id_key)
    .end((error, response) => {
      if (error) {
        return apiCatch(error, getState)
      }

      if (response) {
        return dispatch(setList(response.body.data));
      }
    });
};

เดจเดฎเตเด•เตเด•เต เดฐเต€เดคเดฟเด•เตพ เดชเดฐเดฟเดถเต‹เดงเดฟเด•เตเด•เดพเด‚:

  • เดธเต†เดฑเตเดฑเต เดฒเต†เดตเตฝ เดธเต†เตปเดŸเตเดฐเดฟ เดกเดพเดทเตโ€Œเดฌเต‹เตผเดกเดฟเดฒเต‡เด•เตเด•เต เด’เดฐเต เดฒเต†เดตเตฝ เดชเดฟเดถเด•เต เดšเต‡เตผเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต. เด‡เดคเดฟเดจเต เด—เตเดฃเด™เตเด™เดณเตเดฃเตเดŸเต - 'เดฎเดพเดฐเด•เดฎเดพเดฏ', 'เดชเดฟเดถเด•เต', 'เดฎเตเดจเตเดจเดฑเดฟเดฏเดฟเดชเตเดชเต', 'เดฒเต‹เด—เต', 'เดตเดฟเดตเดฐเด‚, 'เดกเต€เดฌเด—เต', 'เดจเดฟเตผเดฃเตเดฃเดพเดฏเด•').
  • เดธเต†เดฑเตเดฑเต เดฏเต‚เดธเตผ เดเดคเต†เด™เตเด•เดฟเดฒเตเด‚ เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดกเดพเดฑเตเดฑ (เดเดกเดฟ, เด‡เดฎเต†เดฏเดฟเตฝ เดตเดฟเดฒเดพเดธเด‚, เดชเต‡เดฏเตเดฎเต†เดจเตเดฑเต เดชเตเดฒเดพเตป เดฎเตเดคเดฒเดพเดฏเดต) เดธเด‚เดฐเด•เตเดทเดฟเด•เตเด•เดพเตป เดธเดนเดพเดฏเดฟเด•เตเด•เตเดจเตเดจเต.
  • setExtra เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด†เดตเดถเตเดฏเดฎเตเดณเตเดณ เดเดคเต เดกเดพเดฑเตเดฑเดฏเตเด‚ เดตเตเดฏเด•เตเดคเดฎเดพเด•เตเด•เดพเตป เดจเดฟเด™เตเด™เดณเต† เด…เดจเตเดตเดฆเดฟเด•เตเด•เตเดจเตเดจเต, เด‰เดฆเดพเดนเดฐเดฃเดคเตเดคเดฟเดจเต, เดธเตเดฑเตเดฑเต‹เตผ.

เดจเดฟเด™เตเด™เตพเด•เตเด•เต เด’เดฐเต เดฌเด—เดฟเดจเต†เด•เตเด•เตเดฑเดฟเดšเตเดšเต เด‰เดชเดฏเต‹เด•เตเดคเตƒ เดซเต€เดกเตโ€Œเดฌเดพเด•เตเด•เต เดฒเดญเดฟเด•เตเด•เดฃเดฎเต†เด™เตเด•เดฟเตฝ, เดจเดฟเด™เตเด™เตพ showReportDialog เดซเด‚เด—เตโ€Œเดทเตป เด‰เดชเดฏเต‹เด—เดฟเด•เตเด•เดฃเด‚.

Sentry.showReportDialog();

เดคเต€เดฐเตเดฎเดพเดจเด‚:

เดธเต†เตปเดŸเตเดฐเดฟเดฏเต† เด’เดฐเต เดฑเดฟเดฏเดพเด•เตเดฑเตเดฑเต เด†เดชเตเดฒเดฟเด•เตเด•เต‡เดทเดจเดฟเดฒเต‡เด•เตเด•เต เดธเดฎเดจเตเดตเดฏเดฟเดชเตเดชเดฟเด•เตเด•เตเดจเตเดจเดคเดฟเดจเตเดณเตเดณ เด’เดฐเต เดฎเดพเตผเด—เตเด—เด‚ เดžเด™เตเด™เตพ เด‡เดจเตเดจเต เดตเดฟเดตเดฐเดฟเดšเตเดšเต.

โ†’ เดŸเต†เดฒเดฟเด—เตเดฐเดพเด‚ เดšเดพเดฑเตเดฑเต เดšเต†เดฏเตเดคเดคเต เดธเต†เดจเตเดฑเดฟ

เด…เดตเดฒเด‚เดฌเด‚: www.habr.com

เด’เดฐเต เด…เดญเดฟเดชเตเดฐเดพเดฏเด‚ เดšเต‡เตผเด•เตเด•เตเด•