Мы не смогли найти прямое решение, поэтому мы в конечном итоге использовали React Error Boundaries для захвата любого cra sh и регистрации его на страже.
Имейте в виду, что Error Boundaries не фиксирует все сбои (см. цитату ниже). Таким образом, мы придумали ловушку, которая позволяла бы границам ошибок также фиксировать эти сбои (за исключением рендеринга на стороне сервера и сбоев внутри самих границ ошибок). *
Примечание
Границы ошибок не перехватывают ошибки для:
- Обработчики событий (подробнее)
- Асинхронный код (например, обратные вызовы setTimeout или requestAnimationFrame)
- Рендеринг на стороне сервера
- Ошибки, создаваемые в самой границе ошибки (а не в ее дочерних элементах)
~ React
ErrorBoundary. js
const initialState = {
hasError: false,
showError: false
};
export default class ErrorBoundary extends Component {
static propTypes = {
children: PropTypes.node.isRequired
};
static getDerivedStateFromError () {
return { hasError: true };
}
state = initialState;
componentDidCatch (error) {
logToSentry(error);
};
...
См. сторожевые документы
useError. js
const useError = () => {
const [_, setError] = useState();
return useCallback(
e => {
setError(() => {
throw e;
});
},
[setError],
);
};
export default useError;
Пример использования
const throwError = useError();
const someAsyncFn = useCallback(async () => {
try {
const response = await asyncApiRequest();
} catch (e) {
throwError(e)
}
}, []);
const someEventHandler = useCallback(async () => {
try {
doSomethingThatMightCrash();
} catch (e) {
throwError(e)
}
}, []);
Это немного утомительно и могут быть способы упростить это еще больше, но это делает свою работу.