如何debuggingOffice.js + Excel 2016崩溃
(重写了整篇文章,请查看以前版本的编辑历史logging)
需要帮助:
- 我正在经历与我的Office.js项目频繁的Excel(桌面)崩溃
- 即使在VS中启用了所有exception断点,也会崩溃
- 似乎随机崩溃
- EventViewer中只有一个APPCRASH日志
- 代码在Excel Online中运行良好
- 需要关于Office.js开发更好的工作stream程(debugging崩溃)的build议。
我的环境:
- Typescript@2.3.2
- core-js@2.4.1(Promise polyfill)
- Visual Studio 2015(更新3)
- Excel 2016 Pro Plus – 1703(Build 7967.2139)
我终于把我的代码简化为一个最低限度的例子。
- 崩溃在不同的迭代(即第一,第六等)
- 如果我注释掉任一行(在
//TEST1
或//TEST2
),代码将一直运行直到完成(必须在代码更改后重新启动Excel)。
码:
// Office.js entry point Office.initialize = async function (reason) { console.log("Office.JS initialized!"); console.log("Test Start"); for(var i=0; i<100; i++) { console.log(`Iteration ${i}`); await ConvertToListObjectTest(); // TEST1 await DeleteEntireRowTest(); // TEST2 } console.log("Test End"); } // Setup: Generates and activates a random, test worksheet async function Setup(ctx: Excel.RequestContext): Promise<Excel.Worksheet> { // Create const sheetName = `Sheet${+new Date}`; const worksheet = ctx.workbook.worksheets.add(sheetName); ctx.trackedObjects.add(worksheet); // Activate worksheet.activate(); await ctx.sync(); return worksheet; } // TearDown: Cleanup test worksheet async function TearDown(ctx:Excel.RequestContext, worksheet: Excel.Worksheet): Promise<void> { worksheet.delete(); await ctx.sync(); } // Test deleting entire rows, given a range async function DeleteEntireRowTest(): Promise<void> { await Excel.run( async ctx=> { // == SETUP ============ const worksheet = await Setup(ctx); // == RUN ============ // Range to delete const range = await worksheet.getRange("B1:B2"); ctx.trackedObjects.add(range); await ctx.sync(); // Get entire rows from range const entireRow = range.getEntireRow(); entireRow.load("address"); await ctx.sync(); ctx.trackedObjects.add(entireRow); // Delete entire rows console.log(`Deleting: ${entireRow.address}`); entireRow.delete(Excel.DeleteShiftDirection.up); await ctx.sync(); // == CLEAN UP ============ await TearDown(ctx, worksheet); }); } // Test: Given a range, convert to table async function ConvertToListObjectTest(): Promise<void> { await Excel.run( async ctx => { // == SETUP ============ const worksheet = await Setup(ctx); // == RUN ============ // Ger range to convert const range = worksheet.getRange("B3:E20"); ctx.trackedObjects.add(range); // Convert to table const table = worksheet.tables.add(range, true); ctx.trackedObjects.add(table); await ctx.sync(); // Check table name table.load("name"); await ctx.sync(); console.log("Table added: " + table.name); // == CLEAN UP ============ await TearDown(ctx, worksheet); }); }
由于没有崩溃信息,也没有在Visual Studio中中断,所以我不知道何时/何地/什么导致崩溃。
为了提出这个最低限度的例子,我实际上不得不逐行评论我的代码,重新编译,重新运行和崩溃,重复。
这是隔离违规代码的一个非常痛苦的过程。
所以我最后的问题是:
有没有更好的办法来开发office.js项目 ? 特别是在处理错误时,无论是我的代码,office.js还是Excel本身?