Как позволить реагирующему электрону игнорировать неопределенную ошибку? - PullRequest
0 голосов
/ 15 ноября 2018

enter image description here enter image description here

Реакция электронов на окнах, если A равно нулю, вызов A.test заставит приложение перестать работать, затем пользователь должен закрыть приложение и перезапустить его. Как позволить react игнорировать ошибку и продолжить работу. В коде много A.test, я не могу писать везде if(A) A.test. Если это не может быть решено, могу ли я распечатать ошибку в веб-представлении? Поэтому мне не нужно удаленно посещать компьютер пользователя, чтобы увидеть ошибку консоли.

Ответы [ 6 ]

0 голосов
/ 21 ноября 2018

Сложно предложить ответ на ваш вопрос, потому что я не вижу кодов вашего проекта, но если ваша версия реакции - 16, вы можете использовать специальный метод жизненного цикла компонента с именем componentDidCatch.

Внутри этого метода у вас будут следующие значения:

componentDidCatch(error, info) {
  // Do something with error and info
}

Даже вы можете использовать setState внутри этого метода и показать, что хотите.Я думаю, что этот метод может помочь вам для вашего второго желания, печать error в веб-представлении.

0 голосов
/ 21 ноября 2018

Если вы хотите приложить минимальные усилия для перехвата всех необработанных ошибок как из основного процесса, так и из процессов визуализации в Electron, а также из , показывающего их пользователю через диалоговое окно , Самый простой способ - использовать без обработки электронов , который делает именно это:

После его установки (npm i electron-unhandled) как в основном файле, так и в файлах записей рендерера (вероятно, их корень index.js), вам просто нужно добавить в начале:

const unhandled = require('electron-unhandled');

unhandled({ showDialog: true });

Теперь, как говорится, хорошая практика - использовать глобальный перехватчик ошибок, но он действительно плох, если вы используете только это. Вы должны попытаться объяснить свою обработку ошибок более точно, хотя бы методом по методу:

  • .then() { ... }.catch(err => ...) за ваши обещания,
  • (..., (err, res) => { if (err !== null) { ... } ... ) для ваших обратных вызовов,
  • try { ... } catch(err) { ... } для не-асинхронных или await кодовых частей кода.

И, как примечание, я сам создал библиотеку dependenciless , чтобы было легко и безопасно создавать словарь глобальных ошибок, чтобы упорядочить ваши ошибки, но есть и другие альтернативы, если этот не соответствует вашим потребностям.

0 голосов
/ 19 ноября 2018

Я предпочитаю использовать реквизиты по умолчанию . Вы можете установить значение для компонента, который будет назначен для реквизита, если реквизит передан в неопределенном виде. Например, если ваш компонент зависит от массива, вложенного в объект, вы можете установить это значение как пустой массив по умолчанию. Это особенно удобно, когда ваш компонент зависит от массива результатов вызова API, но компонент визуализируется до завершения запроса.

0 голосов
/ 19 ноября 2018

В коде много A.test, я не могу писать где, если (A) A.test

Но почему? Вы можете использовать некоторый редактор для редактирования нескольких файлов. Таким образом, вы можете заменить A.test() на safeTest(A) функцию.

export const safeTest = (Obj) => {
 if (Obj) {
  Obj.test();
 } else {
  // Any action you want
 }
}
0 голосов
/ 19 ноября 2018

Полагаю, наилучшим из возможных решений было бы окружение ваших A.test в try и catch.В этом случае вы можете сделать следующее: catch ошибка A равна null и выполнить какую-либо страницу ошибки с вашей стороны, если вы этого хотите, или просто сохранить ошибку, если вы не хотите выполнять какие-либо операции, и подавитьошибка и продолжить выполнение.

Вы также можете заключить A.test в функцию с try-catch и использовать эту функцию вместо A.test.Таким образом, вы можете избежать нескольких блоков try-catch и справиться с ошибкой в ​​соответствии с вашими требованиями здесь.

0 голосов
/ 19 ноября 2018

ПРИМЕЧАНИЕ

Я думаю, что решение состоит в том, чтобы использовать реагировать на ошибки , как предлагается в консоли.

Вы уже указали, чтовы используете границы ошибок, поэтому после тестирования ваших сценариев в этой скрипте я считаю, что ваша реализация может быть неправильной.


Учитывая аналогичную реализацию для 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давая вам возможность визуализировать запасной вариант как:

Oops! Something went wrong:
ReferenceError: test is not defined
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...