Как позволить реагирующему электрону игнорировать неопределенную ошибку?
Реакция электронов на окнах, если 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
и справиться с ошибкой в соответствии с вашими требованиями здесь.