/
catch-error.js
40 lines (37 loc) · 1.04 KB
/
catch-error.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
import { enqueueRender } from '../component';
/**
* Find the closest error boundary to a thrown error and call it
* @param {object} error The thrown value
* @param {import('../internal').VNode} vnode The vnode that threw
* the error that was caught (except for unmounting when this parameter
* is the highest parent that was being unmounted)
*/
export function _catchError(error, vnode) {
/** @type {import('../internal').Component} */
let component;
for (; (vnode = vnode._parent); ) {
if (
(component = vnode._component) &&
!component.__data._processingException
) {
try {
if (
component.constructor &&
component.constructor.getDerivedStateFromError != null
) {
component.setState(
component.constructor.getDerivedStateFromError(error)
);
} else if (component.componentDidCatch != null) {
component.componentDidCatch(error);
} else {
continue;
}
return enqueueRender((component.__data._pendingError = component));
} catch (e) {
error = e;
}
}
}
throw error;
}