Skip to content

Commit ca1db60

Browse files
authored
error-boundaries: various improvements
1 parent 2b32017 commit ca1db60

File tree

1 file changed

+13
-15
lines changed

1 file changed

+13
-15
lines changed

content/docs/error-boundaries.md

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,24 @@ title: Предохранители
44
permalink: docs/error-boundaries.html
55
---
66

7-
Ранее, ошибки JavaScript внутри компонентов портили внутреннее состояние React и заставляли его [выдавать](https://github.com/facebook/react/issues/4026) [таинственные](https://github.com/facebook/react/issues/6895) [сообщения об ошибках](https://github.com/facebook/react/issues/8579) во время следующего рендера. Эти сообщения всегда вызывались ошибками, расположенными где-то выше в коде приложения, но React не предоставлял способа адекватно обрабатывать их в компонентах и не мог обработать их самостоятельно.
8-
7+
Ранее ошибки JavaScript внутри компонентов портили внутреннее состояние React и заставляли его [выдавать](https://github.com/facebook/react/issues/4026) [таинственные](https://github.com/facebook/react/issues/6895) [сообщения об ошибках](https://github.com/facebook/react/issues/8579) во время следующего рендера. Эти сообщения всегда вызывались ошибками, расположенными где-то выше в коде приложения, но React не предоставлял способа адекватно обрабатывать их в компонентах и не мог обработать их самостоятельно.
98

109
## Представляем предохранители (компоненты Error Boundary) {#introducing-error-boundaries}
1110

12-
Ошибка JavaScript где-то в коде UI не должна прерывать работу всего приложения. Чтобы исправить эту проблему для React-пользователей, React 16 ввводит концепцию "предохранитель" (error boundary).
11+
Ошибка JavaScript где-то в коде UI не должна прерывать работу всего приложения. Чтобы исправить эту проблему для React-пользователей, React 16 ввводит концепцию "предохранителя" (error boundary).
1312

14-
Предохранители это компоненты React, которые **отлавливают ошибки JavaScript в любом месте дерева их дочерних компонентов, сохраняют их в журнале ошибок и выводят запасной UI** вместо рухнувшего дерева компонентов. Предохранители отлавливают ошибки при рендеринге, в методах жизненного цикла и конструкторах дерева компонентов, расположенного под ними.
13+
Предохранители это компоненты React, которые **отлавливают ошибки JavaScript в любом месте деревьев их дочерних компонентов, сохраняют их в журнале ошибок и выводят запасной UI** вместо рухнувшего дерева компонентов. Предохранители отлавливают ошибки при рендеринге, в методах жизненного цикла и конструкторах деревьев компонентов, расположенных под ними.
1514

1615
> Примечание
1716
>
1817
> Предохранители **не** поймают ошибки в:
1918
>
20-
> * Обработчиках событий ([подробнее](#how-about-event-handlers))
21-
> * Асинхронном коде (например колбэках из `setTimeout` или `requestAnimationFrame`)
22-
> * Серверном рендеринге (Server-side rendering)
23-
> * Самом предохранителе (а не в его дочерних компонентах)
19+
> * обработчиках событий ([подробнее](#how-about-event-handlers));
20+
> * асинхронном коде (например колбэках из `setTimeout` или `requestAnimationFrame`);
21+
> * серверном рендеринге (Server-side rendering);
22+
> * самом предохранителе (а не в его дочерних компонентах).
2423
25-
Классовый компонент является предохранителем, если он включает любой (или оба) из следующих методов жизненного цикла: [`static getDerivedStateFromError()`](/docs/react-component.html#static-getderivedstatefromerror) или [`componentDidCatch()`](/docs/react-component.html#componentdidcatch). Используйте `static getDerivedStateFromError()` при рендеринге запасного UI в случае отлова ошибки. Используйте `componentDidCatch()` при написании кода для журналирования информации об отловленной ошибке.
24+
Классовый компонент является предохранителем, если он включает хотя бы один из следующих методов жизненного цикла: [`static getDerivedStateFromError()`](/docs/react-component.html#static-getderivedstatefromerror) или [`componentDidCatch()`](/docs/react-component.html#componentdidcatch). Используйте `static getDerivedStateFromError()` при рендеринге запасного UI в случае отлова ошибки. Используйте `componentDidCatch()` при написании кода для журналирования информации об отловленной ошибке.
2625

2726
```js{7-10,12-15,18-21}
2827
class ErrorBoundary extends React.Component {
@@ -62,7 +61,7 @@ class ErrorBoundary extends React.Component {
6261

6362
Предохранители работают как JavaScript-блоки `catch {}`, но только для компонентов. Только классовые компоненты могут выступать в роли предохранителей. На практике чаще всего целесообразным будет один раз описать предохранитель и дальше использовать его по всему приложению.
6463

65-
Стоит обратить внимание, что **предохранители отлавливают ошибки исключительно в своих дочерних компонентах**. Предохранитель не сможет отловить ошибку внутри самого себя. Если предохранителю не удается отрендерить сообщение об ошибке, то ошибка всплывает до ближайшего предохранителя, расположенного над ним в дереве компонентов. Этот аспект их поведения тоже напоминает работу блоков `catch {}` в JavaScript.
64+
Обратите внимание, что **предохранители отлавливают ошибки исключительно в своих дочерних компонентах**. Предохранитель не сможет отловить ошибку внутри самого себя. Если предохранителю не удается отрендерить сообщение об ошибке, то ошибка всплывает до ближайшего предохранителя, расположенного над ним в дереве компонентов. Этот аспект их поведения тоже напоминает работу блоков `catch {}` в JavaScript.
6665

6766
## Живой пример {#live-demo}
6867

@@ -89,7 +88,7 @@ class ErrorBoundary extends React.Component {
8988

9089
## Стек вызовов компонентов {#component-stack-traces}
9190

92-
В режиме разработки React 16 выводит на консоль сообщения обо всех ошибках, возникших при рендеринге, даже если приложения случайно их проглотило. Помимо сообщения об ошибке и стека JavaScript, React 16 также выводит и стек вызовов компонентов. Теперь вы в точности можете видеть в каком именно месте дерева компонентов случилось страшное:
91+
В режиме разработки React 16 выводит на консоль сообщения обо всех ошибках, возникших при рендеринге, даже если они никак не сказались на работе приложения. Помимо сообщения об ошибке и стека JavaScript, React 16 также выводит и стек вызовов компонентов. Теперь вы в точности можете видеть в каком именно месте дерева компонентов случилось страшное:
9392

9493
<img src="../images/docs/error-boundaries-stack-trace.png" style="max-width:100%" alt="Ошибка, отловленная предохранителем">
9594

@@ -101,12 +100,11 @@ class ErrorBoundary extends React.Component {
101100

102101
> Примечание
103102
>
104-
> Имена компонентов, выводимые в их стеке вызовов, определяются свойством [`Function.name`](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/name). Если ваше приложение поддерживает более старые браузеры и устройства, которые могут ещё не предоставлять его нативно (например, IE 11), рассмотрите возможность включения полифилла `Function.name` в бандл вашего приложения, например [`function.name-polyfill`](https://github.com/JamesMGreene/Function.name). В качстве альтернативы, вы можете явным образом задать проп [`displayName`](/docs/react-component.html#displayname) в каждом из ваших компонентов.
105-
103+
> Имена компонентов, выводимые в их стеке вызовов, определяются свойством [`Function.name`](https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Global_Objects/Function/name). Если ваше приложение поддерживает более старые браузеры и устройства, которые могут ещё не предоставлять его нативно (например, IE 11), рассмотрите возможность включения полифилла `Function.name` в бандл вашего приложения, например [`function.name-polyfill`](https://github.com/JamesMGreene/Function.name). В качестве альтернативы, вы можете явным образом задать проп [`displayName`](/docs/react-component.html#displayname) в каждом из ваших компонентов.
106104
107105
## А как насчёт try/catch? {#how-about-trycatch}
108106

109-
`try` / `catch` - отличная конструкция, но она работает исключительно в императивном коде:
107+
`try` / `catch` отличная конструкция, но она работает исключительно в императивном коде:
110108

111109
```js
112110
try {
@@ -159,7 +157,7 @@ class MyComponent extends React.Component {
159157

160158
Обратите внимание, что приведённый выше пример демонстрирует стандартное поведение JavaScript и не использует предохранителей.
161159

162-
## Изменения в названиях по сравнению с React 15 {#naming-changes-from-react-15}
160+
## Изменение названия метода по сравнению с React 15 {#naming-changes-from-react-15}
163161

164162
React 15 включал очень ограниченную поддержку предохранителей с другим названием метода: `unstable_handleError`. Этот метод больше не работает и вам будет нужно заменить его в вашем коде на `componentDidCatch` начиная с первого бета-релиза React 16.
165163

0 commit comments

Comments
 (0)