在 SpreadJS 事件绑定中没有抛出异常
No exception being thrown inside SpreadJS event binding
首先,我不确定这是 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/ .......
有什么方法可以配置我的环境(linter、编译器、angular 本身)来捕获这些异常,而不必到处用 try/catch 子句来发送我的代码?
感谢您的回答,对于新手问题我深表歉意
我发现这个问题是由于使用了 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)
首先,我不确定这是 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/ .......
有什么方法可以配置我的环境(linter、编译器、angular 本身)来捕获这些异常,而不必到处用 try/catch 子句来发送我的代码?
感谢您的回答,对于新手问题我深表歉意
我发现这个问题是由于使用了 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)