ΠΡ ΠΈΠ·ΡΡΠ°Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Sentry Ρ React.
ΠΡΠ° ΡΡΠ°ΡΡΡ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΡΡΡΡ ΡΠ΅ΡΠΈΠΈ, Π½Π°ΡΠΈΠ½Π°ΡΡΠ΅ΠΉΡΡ Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ°Ρ
Sentry Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅:
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ React
Π‘Π½Π°ΡΠ°Π»Π° Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΎΠ΅ΠΊΡ Sentry Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ; Ρ ΡΠ°ΠΉΡΠ° Sentry. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π²ΡΠ±ΠΈΡΠ°Π΅ΠΌ React.
ΠΡ Π²Π½ΠΎΠ²Ρ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π½Π°ΡΠΈ Π΄Π²Π΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ, Hello ΠΈ Error, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ 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 ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π΅Π½Π½ΡΡ ΡΠ±ΠΎΡΠΎΠΊ
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌ Π½Π°ΡΠΈ ΠΊΠ½ΠΎΠΏΠΊΠΈ Hello ΠΈ Error ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΈΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
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
ΠΈ ΠΈΠ· build ΠΏΠ°ΠΏΠΊΠΈ Π²Π²Π΅Π΄ΠΈΡΠ΅:
npx http-server -c-1
ΠΡΠΎΠ±Π»Π΅ΠΌΠ°, Ρ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ ΡΡΠΎΠ»ΠΊΠ½Π΅ΠΌΡΡ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π·Π°ΠΏΠΈΡΠΈ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Sentry ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° Π½ΠΎΠΌΠ΅ΡΠ° ΡΡΡΠΎΠΊ Π² ΡΠΌΠ΅Π½ΡΡΠ΅Π½Π½ΠΎΠΌ ΠΏΠ°ΠΊΠ΅ΡΠ΅; Π½Π΅ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
Π‘Π»ΡΠΆΠ±Π° Sentry ΠΎΠ±ΡΡΡΠ½ΡΠ΅Ρ ΡΡΠΎ, Π²ΡΡΡΠ³ΠΈΠ²Π°Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠ΅ ΠΊΠ°ΡΡΡ Π΄Π»Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΏΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΊΠΈ. Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ Π±Π΅ΠΆΠΈΠΌ ΠΎΡ localhost (Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ ΡΠ»ΡΠΆΠ±ΠΎΠΉ Sentry).
Π Π΅ΡΠ΅Π½ΠΈΡ (ΠΡΡ ΠΎΠ΄Π½ΡΠ΅ ΠΠ°ΡΡΡ)
Π Π΅ΡΠ΅Π½ΠΈΠ΅ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠ²ΠΎΠ΄ΠΈΡΡΡ ΠΊ Π·Π°ΠΏΡΡΠΊΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ³ΠΎ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°. ΠΠ΄Π½Π° ΠΏΡΠΎΡΡΠ°Ρ ΠΊΠ½ΠΎΠΏΠΊΠ° ΠΎΡΠ²Π΅ΡΠ° Π½Π° Π½Π΅Π³ΠΎ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ²ΠΈΡ GitHub Pages (Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΎ). Π¨Π°Π³ΠΈ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅:
-
Π‘ΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ°ΠΏΠΊΠΈ build Π² ΠΏΠ°ΠΏΠΊΡ docs Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΌ ΠΊΠ°ΡΠ°Π»ΠΎΠ³Π΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ.
-
ΠΠΊΠ»ΡΡΠΈΡΠ΅ GitHub Pages Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ (ΠΈΠ· GitHub), ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΏΠΊΡ docs Π² master Π²Π΅ΡΠ²ΠΈ
-
ΠΠ΅ΡΠ΅Π½Π΅ΡΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π° GitHub
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΏΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ ΠΏΠΎΠ½ΡΠ», ΡΡΠΎ ΠΌΠ½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ create-create-app ΡΡΠ½ΠΊΡΠΈΡ Π΄ΠΎΠΌΠ°ΡΠ½Π΅ΠΉ ΡΡΡΠ°Π½ΠΈΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π‘Π²ΠΎΠ΄ΠΈΠ»ΠΎΡΡ ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΊ package.json:
"homepage": "https://larkintuckerllc.github.io/hello-sentry/"
ΠΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ Π·Π°ΠΏΡΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½Π° ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ:
ΠΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ ΠΠΎΠΉΠΌΠ°Π½Π½ΡΡ ΠΡΠΈΠ±ΠΎΠΊ
ΠΠ°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠΉΠ΄Π΅ΠΌ ΡΠ΅ΡΠ΅Π· Π½Π°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Hello.
Π‘ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, ΠΏΠΎΡΠ²Π»ΡΡΡΠ΅ΠΉΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
ΠΠ°Π±Π»ΡΠ΄Π΅Π½ΠΈΡ:
- ΠΡΠΎΡ ΠΎΡΡΠ΅Ρ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΠ½ΡΠΌ, BRAVO.
ΠΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ ΠΠ΅ΡΡΡΠ΅Π½Π½ΡΡ ΠΡΠΈΠ±ΠΎΠΊ
ΠΠ½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠΉΠ΄Π΅ΠΌ ΡΠ΅ΡΠ΅Π· Π½Π°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Error.
Π‘ ΠΎΡΠΈΠ±ΠΊΠΎΠΉ, ΠΏΠΎΡΠ²Π»ΡΡΡΠ΅ΠΉΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
ΠΡΡΡΠ°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° Π½Π΅ΡΡΡΠ΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ (ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³)
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΡΠ°Π½ΠΈΡ ΠΡΠΈΠ±ΠΎΠΊ
ΠΡΠΈΠ±ΠΊΠ° JavaScript Π² ΡΠ°ΡΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Π° Π½Π°ΡΡΡΠ°ΡΡ ΡΠ°Π±ΠΎΡΡ Π²ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π§ΡΠΎΠ±Ρ ΡΠ΅ΡΠΈΡΡ ΡΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ React, React 16 Π²Π²ΠΎΠ΄ΠΈΡ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ½ΡΡΠΈΠ΅ "Π³ΡΠ°Π½ΠΈΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ".
ΠΡΠ°Π½ΠΈΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ β ΡΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ React, ΠΊΠΎΡΠΎΡΡΠ΅ Π»ΠΎΠ²ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ JavaScript Π² Π»ΡΠ±ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΡΠ²ΠΎΠ΅Π³ΠΎ Π΄ΠΎΡΠ΅ΡΠ½Π΅Π³ΠΎ Π΄Π΅ΡΠ΅Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΡΠ΅Π³ΠΈΡΡΡΠΈΡΡΡΡ ΡΡΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ ΠΈ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡ ΡΠ΅Π·Π΅ΡΠ²Π½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π²ΠΌΠ΅ΡΡΠΎ Π΄Π΅ΡΠ΅Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², ΠΊΠΎΡΠΎΡΠΎΠ΅ ΡΠ°Π·Π±ΠΈΠ»ΠΎΡΡ. ΠΡΠ°Π½ΠΈΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠ»Π°Π²Π»ΠΈΠ²Π°ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π°, Π² ΠΌΠ΅ΡΠΎΠ΄Π°Ρ ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π° ΠΈ Π² ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΠ°Ρ Π²ΡΠ΅Π³ΠΎ Π΄Π΅ΡΠ΅Π²Π° ΠΏΠΎΠ΄ Π½ΠΈΠΌΠΈ.
β¦
ΠΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π»Ρ Π½Π΅ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½Π½ΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ
ΠΡΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π΅Ρ Π²Π°ΠΆΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅. ΠΠ°ΡΠΈΠ½Π°Ρ Ρ React 16, ΠΎΡΠΈΠ±ΠΊΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ Π±ΡΠ»ΠΈ ΠΏΠΎΠΉΠΌΠ°Π½Ρ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π³ΡΠ°Π½ΠΈΡΠ΅ΠΉ ΠΎΡΠΈΠ±ΠΎΠΊ, ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΡΠ°Π·ΠΌΠΎΠ½ΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π²ΡΠ΅Π³ΠΎ Π΄Π΅ΡΠ΅Π²Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² React.
β Dan Abramov β
Error Handling in React 16
ΠΠ°ΠΆΠ½ΠΎΠ΅ ΡΡΠΎΡΠ½Π΅Π½ΠΈΠ΅, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π°Π½ΡΠ»ΠΎ Ρ ΠΌΠ΅Π½Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Ρ ΠΏΠΎΠ½ΡΠ» ΡΡΠΎ, Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²ΡΡΠ΅ΡΠΏΠΎΠΌΡΠ½ΡΡΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅ΠΌΡΠΌΠΈ Π² ΠΌΠ΅ΡΠΎΠ΄Π΅ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° (ΠΈΠ»ΠΈ, ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ Π²Π΅ΡΠΎΡΡΠ½ΠΎ, Π² Π»ΡΠ±ΠΎΠΌ ΠΈΠ· ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² ΠΆΠΈΠ·Π½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΊΠ»Π°). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π³ΡΠ°Π½ΠΈΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π½Π΅ ΠΏΡΠΈΠ½Π΅ΡΠ»ΠΎ Π±Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ»ΡΠ·Ρ Ρ Π½Π°ΡΠ΅ΠΉ ΠΊΠ½ΠΎΠΏΠΊΠΎΠΉ Error; ΡΡΠ° ΠΎΡΠΈΠ±ΠΊΠ° Π±ΡΠ»Π° Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ ΡΠ΅Π»ΡΠΊΠ°.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡΠΈΠ±ΠΊΠΈ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ, Π° Π·Π°ΡΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π³ΡΠ°Π½ΠΈΡΡ ΠΎΡΠΈΠ±ΠΎΠΊ Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ·ΡΡΠ½ΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΡΠΈΠ±ΠΊΠΈ.
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>
);
}
}
...
ΠΡΠΈ ΡΡΠΎΠΌ Π½Π°ΠΆΠ°ΡΠΈΠ΅ ΠΊΠ½ΠΎΠΏΠΊΠΈ Render Error ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ ΡΠ΅Π·Π΅ΡΠ²Π½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ ΠΈ ΡΠΎΠΎΠ±ΡΠ°Π΅Ρ ΠΎΠ± ΠΎΡΠΈΠ±ΠΊΠ΅ Sentry.
ΠΠ°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅
ΠΠ°Π΄Π΅ΡΡΡ, Π²Π°ΠΌ Π±ΡΠ»ΠΎ ΡΡΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ.
P.S.
P.S. Π’Π΅Π»Π΅Π³ΡΠ°ΠΌ ΡΠ°Ρ ΠΏΠΎ Sentry
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com