рд╣рд╛рдореА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдХреЛ рд╕рд╛рде Sentry рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдЕрдиреНрд╡реЗрд╖рдг рдЧрд░реНрджреИрдЫреМрдВред
рдпреЛ рд▓реЗрдЦ рдПрдЙрдЯрд╛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд╕реЗрдиреНрдЯреНрд░реА рддреНрд░реБрдЯрд┐рд╣рд░реВ рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░реНрди рд╕реБрд░реБ рд╣реБрдиреЗ рд╢реНрд░реГрдВрдЦрд▓рд╛рдХреЛ рдЕрдВрд╢ рд╣реЛ:
рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдкрд╣рд┐рд▓реЗ рд╣рд╛рдореАрд▓реЗ рдпреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдирдпрд╛рдБ рд╕реЗрдиреНрдЯреНрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдердкреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ; рд╕реЗрдиреНрдЯреНрд░реА рд╡реЗрдмрд╕рд╛рдЗрдЯрдмрд╛рдЯред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛ рд╣рд╛рдореА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЫрд╛рдиреНрдЫреМрдВред
рд╣рд╛рдореА рд╣рд╛рдореНрд░рд╛ рджреБрдИ рдмрдЯрдирд╣рд░реВ, рд╣реЗрд▓реЛ рд░ рдПрд░рд░, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдХреЛ рд╕рд╛рде рдПрдЙрдЯрд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рдкреБрди: рд▓рд╛рдЧреВ рдЧрд░реНрдиреЗрдЫреМрдВред рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рд╕реНрдЯрд╛рд░реНрдЯрд░ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реЗрд░ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВ:
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 рдкреГрд╖реНрда рд╕реЗрд╡рд╛ (рдирд┐:рд╢реБрд▓реНрдХ) рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рд╕рд╛рдзрд╛рд░рдг рдЬрд╡рд╛рдл рдмрдЯрдиред рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдЪрд░рдгрд╣рд░реВ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫрдиреН:
-
рдлреЛрд▓реНрдбрд░рдХрд╛ рд╕рд╛рдордЧреНрд░реАрд╣рд░реВ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдирд┐рд░реНрдорд╛рдг рдлреЛрд▓реНрдбрд░рдорд╛ рдХрд╛рдЧрдЬрд╛рддрд╣рд░реВ рднрдгреНрдбрд╛рд░рдХреЛ рдореВрд▓ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ред
-
рдЦреЛрд▓реНрдиреБрд╣реЛрд╕реН GitHub рдкреГрд╖реНрдард╣рд░реВ рднрдгреНрдбрд╛рд░рдорд╛ (GitHub рдмрд╛рдЯ) рдХрд╛рдЧрдЬрд╛рдд рдлреЛрд▓реНрдбрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдорд╛рд╕реНрдЯрд░ рд╢рд╛рдЦрд╛рд╣рд░реВ
-
GitHub рдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВ рдкреБрд╢ рдЧрд░реНрдиреБрд╣реЛрд╕реН
рднрдиреНрдиреБ: рдореИрд▓реЗ рдХреЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗрд░ рдмреБрдЭреЗ рдкрдЫрд┐ рд╕рд┐рд░реНрдЬрдирд╛-рд╕рд┐рд░реНрдЬрдирд╛-рдПрдк рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реБ рдЧрд░реНрди рдЧреГрд╣ рдкреГрд╖реНрда рдкреНрд░рдХрд╛рд░реНрдпред package.json рдорд╛ рдирд┐рдореНрди рдердкреНрди рддрд▓ рдЖрдпреЛ:
"homepage": "https://larkintuckerllc.github.io/hello-sentry/"
рдЪрд▓рд┐рд░рд╣реЗрдХреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рдЕрдиреНрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рдЫ:
рд╕рдорд╛рддрд┐рдПрдХрд╛ рдмрдЧрд╣рд░реВрдХреЛ рдЪрд┐рддреНрд░рдг
рдирдорд╕реНрддреЗ рдмрдЯрди рдХреНрд▓рд┐рдХ рдЧрд░реЗрд░ рд╣рд┐рдВрдбреМрдВред
рдпрд╕ рдкреНрд░рдХрд╛рд░ рджреЗрдЦрд┐рдиреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрдЧ:
рдЕрд╡рд▓реЛрдХрдирд╣рд░реВ:
- рдпреЛ рдмрдЧ рд░рд┐рдкреЛрд░реНрдЯ рд╕реНрдкрд╖реНрдЯ рд╣реБрди рд╕рдХреЗрди, рдФрдВрдареА.
рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдмреЗрд╣рд┐рд╕рд╛рдмрдХреЛ рдЪрд┐рддреНрд░рдг
рддреНрдпрд╕реНрддреИ рдЧрд░реА, рдмрдЯрди рдХреНрд▓рд┐рдХ рдорд╛рд░реНрдлрдд рдЬрд╛рдФрдВ рддреНрд░реБрдЯрд┐.
рдпрд╕ рдкреНрд░рдХрд╛рд░ рджреЗрдЦрд┐рдиреЗ рддреНрд░реБрдЯрд┐ рд╕рдВрдЧ:
рдмреЗрд╣рд┐рд╕рд╛рдм рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рд░рд╛рдореНрд░реЛ рд╣реНрдпрд╛рдиреНрдбрд▓рд┐рдЩ (рд░реЗрдиреНрдбрд░рд┐рдЩ)
рддреНрд░реБрдЯрд┐ рд╕реАрдорд╛рд╣рд░реВрдХреЛ рдкрд░рд┐рдЪрдп
рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдиреНрдЯрд░рдлреЗрд╕рдХреЛ рднрд╛рдЧрдорд╛ JavaScript рддреНрд░реБрдЯрд┐рд▓реЗ рд╕рдореНрдкреВрд░реНрдг рдЕрдиреБрдкреНрд░рдпреЛрдЧрд▓рд╛рдИ рддреЛрдбреНрдиреБ рд╣реБрдБрджреИрдиред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдпреЛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ 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 рджреЗрдЦрд╛рдЙрдБрдЫ рд░ рд╕реЗрдиреНрдЯреНрд░реАрдорд╛ рддреНрд░реБрдЯрд┐ рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░реНрдЫред
рд╕рдорд╛рдкреНрддрд┐
рдорд▓рд╛рдИ рдЖрд╢рд╛ рдЫ рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдпреЛ рдЙрдкрдпреЛрдЧреА рдкрд╛рдЙрдиреБрднрдпреЛред
рд╕реЗрдиреНрдЯреНрд░реА рдорд╛рд░реНрдлрдд PS рдЯреЗрд▓рд┐рдЧреНрд░рд╛рдо рдЪреНрдпрд╛рдЯ
рд╕реНрд░реЛрдд: www.habr.com