Как обрабатывать ошибки и исключения в редукторах Redux? - PullRequest
4 голосов
/ 21 мая 2019

В настоящее время мы тестируем нашу обработку ошибок в нашем приложении React / Redux.(Я уже читал https://github.com/reduxjs/redux/issues/1960). В React мы реализовали ErrorBoundaries , и это работает довольно хорошо: больше нет пустых страниц для необработанных исключений.

Нет, мы не пытались выдавать ошибки в редукторах имы видим, как они вошли в консоль с нетронутым состоянием редукции.

Редукторы ДОЛЖНЫ БЫТЬ чистыми!

Я определенно могу это поддержать. Функция должна быть "легкой"без побочных эффектов и хорошо протестировано. Дело в том, что разработчик редуктора может делать ложные предположения (например, о том, какое свойство в состоянии редукса может быть неопределенным). В результате получается

[Error] Unhandled Promise Rejection: TypeError: undefined is not an object (evaluating 'someVariableWithCanBeNullOrUndefined.someFunction')

Можно утверждать,: по крайней мере, нет белой страницы. Но состояние приложения теперь немного неловкое, так как все действия отправляются и выполняются, но не корректно сокращаются. Такие ошибки легко можно отслеживать. Есть ли способ справиться с этим во время выполнения программы?ошибки? Может быть, даже представить их в React's ErrorBoundary?

Пример ошибочной функции редуктора, когдаch результаты ТОЛЬКО в записи журнала:

reduceSomeState(state = new SomeState(), action: SomeAction) {
    throw new Error('some runtime error: e.g. a value in the state is undefined and accessed here');
}

1 Ответ

0 голосов
/ 15 июля 2019

Насколько мне известно, исключения не могут быть обработаны в редукторах , ни connect(mapStateToProps, mapDispatchToProps)(View).

Хотя решение - установить глобальный обработчик ошибок. Можно выглядеть так:

import * as React from 'react';
import {render} from 'react-dom';
import {GlobalErrorView} from '../../globalError/GlobalErrorView';

window.onerror = (event: Event | string, source?: string, lineno?: number, colno?: number, error?: Error) => {

    render(
        (
            <GlobalErrorView
                error={error}
                okAction={() => window.location.reload()}
            />
        ),
        document.getElementById('app') as HTMLElement
    );
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...