Как позволить реагирующему электрону игнорировать неопределенную ошибку?

enter image description here enter image description here

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