SpreadJS事件绑定内不会引发任何异常

时间:2019-05-22 15:07:30

标签: angular spreadjs

首先,我不确定这是Angular问题还是ES6问题。

在我们的应用程序中进行某些重构期间,我们将方法提取到了另一个文件中,这样我们犯了以下错误:

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

this.getChanges()是我们在重构之前使用的主文件中的方法,但是在此新文件中,该方法不存在,箭头功能也如上所述。 但是,在调用setDataTypeToColumn(x, y)时,我们不会收到任何控制台错误。该应用程序无提示地失败,更糟糕的是,后续代码最终没有被执行。

仅当我用try..catch包围setDataType的调用时,出现异常错误:

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/ .......

有什么方法可以配置我的环境(lint,编译器,angular本身)以捕获这些异常,而不必到处都使用try / catch子句对我的代码进行垃圾邮件处理?

感谢您的回答,并对新手问题表示歉意

1 个答案:

答案 0 :(得分:0)

我发现此问题是由于使用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)