Внутри привязки события SpreadJS не генерируется исключение

Прежде всего, я не уверен, является ли это проблемой Angular или проблемой ES6.

Во время некоторого рефакторинга в нашем приложении мы извлекли метод в другой файл и при этом допустили следующую ошибку:

export const setDataTypeToColumn = (
  row: any,
  col: any
) => {
  const updates = this.getChanges().updatedTables;
  // Some code in here
}

this.getChanges() — это метод в основном файле, который мы использовали до рефакторинга, но в этом новом файле его нет, как и в функции стрелки, как описано. Однако при вызове setDataTypeToColumn(x, y) мы не получаем никакой ошибки консоли. Приложение незаметно завершает работу, и, что еще хуже, последующий код не выполняется.

Только когда я окружаю вызов setDataType с помощью try..catch, я получаю ошибку исключения:

TypeError: _this.getChanges is not a function
    at Object.push../src/app/components/model-structure/validators.ts.exports.setDataTypeToColumn (validators.ts:120)
    at SetupComponent.push../src/app/components/model-structure/ .......

Есть ли способ настроить мою среду (линтер, компилятор, сам angular) для перехвата этих исключений без необходимости спамить мой код предложениями try/catch повсюду?

Спасибо за ваши ответы и мои извинения за вопрос новичка

Что происходит, когда вы бежите ng build --prod? это не удается?

user4676340 22.05.2019 17:09

На этом этапе ошибок нет. У нас даже есть весь проект под CI, чтобы попытаться поймать как можно больше этих ошибок, что делает эту проблему еще более раздражающей/сложной для отладки, поскольку снаружи код выглядит правильно.

Narshe 22.05.2019 17:15

Что ж, если даже Stackblitz знает об этом, это означает, что вы что-то сделали со своей конфигурацией CLI / TS ... Не могли бы вы предоставить минимальный воспроизводимый пример? По своему опыту я никогда не видел, чтобы компилятор принимал такую ​​ошибку...

user4676340 22.05.2019 17:17

Я думаю, что я уменьшил проблему до одной из библиотек, которые использует проект, который использует эти исключения. Поскольку я новичок в проекте и работаю под углом, я подумал, что это как-то связано с тем, как NG обрабатывает исключения, но нет. При вызове метода в OnInit исключение отображается в консоли, как и ожидалось. Я обновлю этот пост как можно скорее

Narshe 22.05.2019 18:25

Ну, тебе лучше задать другой вопрос, этот уже похоронен!

user4676340 22.05.2019 18:30
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Обработка ошибок при выполнении HTTP-запросов в JavaScript.
Обработка ошибок при выполнении HTTP-запросов в JavaScript.
Каждый проект должен выполнять HTTP-запросы, и, конечно, некоторые из этих запросов могут содержать ошибки. Нам нужно знать, как обрабатывать эти...
Включение UTF-8 в jsPDF с помощью Angular
Включение UTF-8 в jsPDF с помощью Angular
Привет, разработчики, я предполагаю, что вы уже знаете, как экспортировать pdf через jsPDF. Если ответ отрицательный, то вы можете ознакомиться с моей...
1
5
123
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что эта проблема возникает из-за использования библиотеки Grapecity SpreadJS.

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

Минимальный пример:

    // Trigger on cell change
    this.sheet.bind(GC.Spread.Sheets.Events.CellChanged, (event, info) => {
      thisvariableisnotdefined = 0;  
    });

Это не вызовет никаких ошибок при выполнении и, очевидно, идентифицируется IDE и компилятором. Более сложные случаи могут быть легко найдены, как тот, который был опубликован изначально: мы вызвали setDataTypeToColumn изнутри функции, и мы никогда не возвращали исключение. Использование предложения try/catch вне функции также не изменит результат.

Вам нужно поместить try/catch внутри функции обратного вызова, чтобы обработать любые возможные исключения, выброшенные внутри:

    // Trigger on cell change
    this.sheet.bind(GC.Spread.Sheets.Events.CellChanged, (event, info) => {
      try {
        thisvariableisnotdefined = 0;
      } catch (err) {
        console.error(err);
      }
    });

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

example.component.ts:386 ReferenceError: thisvariableisnotdefined is not defined
    at HTMLInputElement.<anonymous> (example.component.ts:350)
    at HTMLInputElement.j (gc.spread.sheets.all.min.js:25)
    at J.trigger (gc.spread.sheets.all.min.js:26)
    at na.Wq (gc.spread.sheets.all.min.js:30)
    at na.Bq (gc.spread.sheets.all.min.js:30)
    at T.setValue (gc.spread.sheets.all.min.js:29)
    at T.do (gc.spread.sheets.all.min.js:29)
    at na.uq (gc.spread.sheets.all.min.js:29)
    at na.setValue (gc.spread.sheets.all.min.js:29)

Другие вопросы по теме