Реакция электронов на окнах, если A равно нулю, вызов A.test заставит приложение перестать работать, а затем пользователь должен закрыть приложение и перезапустить его. Как дать react игнорировать ошибку и продолжить работу. В коде много A.test, я не могу писать везде, if(A) A.test. Если это не может быть решено, могу ли я распечатать ошибку в веб-представлении? Поэтому мне не нужно удаленно посещать компьютер пользователя, чтобы увидеть ошибку консоли.
Как позволить реагирующему электрону игнорировать неопределенную ошибку?
Ответ 1
НОТА
Я думаю, что решение состоит в том, чтобы использовать границы реагирующих ошибок, как это предлагается в консоли.
Вы уже указали, что используете границы ошибок, поэтому после тестирования ваших сценариев в этой скрипте я считаю, что ваша реализация может быть неправильной.
Учитывая аналогичную реализацию для ErrorBoundary в документах:
class ErrorBoundary extends React.Component {
state = { hasError: '' };
render() {
return this.state.hasError ? (
<span>Oops! Something went wrong:<br />{this.state.hasError}</span>
) : this.props.children;
}
}
ErrorBoundary.getDerivedStateFromError = (error) => ({ hasError: error.toString() });
Этот компонент будет выполнять откат, когда любой из его дочерних элементов прерывается.
Границы ошибок - это компоненты React, которые перехватывают ошибки JavaScript в любом месте своего дочернего дерева компонентов, регистрируют эти ошибки и отображают резервный пользовательский интерфейс.
Это будет выглядеть примерно так:
<MyReactApp>
<ErrorBoundary>
<ChatContent />
</ErrorBoundary>
</MyReactApp>
Теперь любая ошибка в ChatContent будет ErrorBoundary что ErrorBoundary вам возможность сделать откат, например:
Oops! Something went wrong:
ReferenceError: test is not defined
Ответ 2
Трудно дать ответ на ваш вопрос, потому что я не вижу кодов вашего проекта, но если ваша версия реакции - 16, вы можете использовать специальный метод жизненного цикла компонента, который называется componentDidCatch.
Внутри этого метода у вас будут следующие значения:
componentDidCatch(error, info) {
// Do something with error and info
}
Даже вы можете использовать setState внутри этого метода и показать, что вы хотите. Я думаю, что этот метод может помочь вам для вашего второго желания, error печати в веб-представлении.
Ответ 3
В коде много A.test, я не могу писать везде, если (A) A.test
Но почему? Вы можете использовать какой-то редактор для редактирования нескольких файлов. Таким образом, вы можете заменить A.test() на safeTest(A).
export const safeTest = (Obj) => {
if (Obj) {
Obj.test();
} else {
// Any action you want
}
}
Ответ 4
Я предпочитаю использовать реквизит по умолчанию. Вы можете установить значение для компонента, который будет назначен для реквизита, если реквизит передан в неопределенном виде. Например, если ваш компонент зависит от массива, вложенного в объект, вы можете установить это значение как пустой массив по умолчанию. Это особенно удобно, когда ваш компонент зависит от массива результатов вызова API, но компонент визуализируется до завершения запроса.
Ответ 5
Если вы хотите приложить минимальные усилия, чтобы перехватить все необработанные ошибки как основного процесса, так и процесса рендеринга в Electron, а также показать их пользователю через диалог, простой способ - использовать необработанный электрон, который делает именно это:
После его установки (npm я electron-unhandled), как в основном файле, так и в файлах записей рендерера (вероятно, их корневой index.js), вам просто нужно добавить в начале:
const unhandled = require('electron-unhandled');
unhandled({ showDialog: true });
Теперь, как говорится, хорошая практика - использовать глобальный перехватчик ошибок, но он действительно плох, если вы используете только это. Вы должны попытаться охватить вашу обработку ошибок более точно, по крайней мере, методом по методу:
-
.then() {... }.catch(err =>...)для ваших обещаний, -
(..., (err, res) => { if (err !== null) {... }... )для ваших обратных вызовов, -
try {... } catch(err) {... }для не асинхронных илиawait-based частей кода.
И, как примечание, я сам создал библиотеку зависимостей, чтобы было легко и безопасно создать словарь глобальных ошибок, чтобы упорядочить ваши ошибки, но есть и другие альтернативы, если этот не соответствует вашим потребностям.
Ответ 6
Я предполагаю, что наилучшее решение этой проблемы будет окружать ваш A.test в try и catch. В этом случае вы можете catch ошибку, если A имеет значение null и выполнить какую-либо страницу с ошибкой со своей стороны, если вы этого хотите, или просто сохранить ошибку, если вы не хотите выполнять какую-либо операцию, подавить ошибку и продолжить выполнение.
Вы также можете A.test в функцию с помощью try-catch и использовать эту функцию вместо A.test. Таким образом, вы можете избежать нескольких блоков try-catch и справиться с ошибкой в соответствии с вашими требованиями здесь.

