Исключение не возникает в привязке события SpreadJS

Прежде всего, я не уверен, является ли это угловой проблемой или проблемой 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/ .......

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

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

1 ответ

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

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

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

    // 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)
Другие вопросы по тегам