Visio VSTO插件Redo时抛出异常但功能正常 是否为可忽略的已知问题
Visio VSTO 调试阶段Redo抛出异常问题解答
这是Visio VSTO开发领域非常常见的已知问题,不需要过度担心。
异常产生原因
- 你遇到的两个异常本质都是调试器捕获的首次机会异常,不会传递到用户运行时,也不会被当作未处理异常导致程序崩溃。Visio的撤销/重做队列在重放
QUEUEMARKEREVENT触发的操作时,会临时锁定相关形状的COM对象指针,你的代码首次访问形状对象时触发的临时错误会被包装成System.Runtime.InteropServices.COMException抛出,VSTO宿主层会自动重试,直到指针解锁后逻辑就能正常执行,所以实际运行没有任何问题。 - 外层的
System.Reflection.TargetInvocationException只是反射调用事件委托时的包装异常,根因就是前面提到的COM临时锁定错误。
处理建议
- 如果终端用户运行时无任何报错、数据和图表表现正常,完全可以忽略该异常,不需要深入排查。
- 若要避免调试过程中频繁被异常中断,可以在Visual Studio的异常设置中取消勾选这两个异常类型的「引发时中断」选项,也可以在
MarkerEvent处理逻辑中显式捕获特定错误码的COM异常,直接跳过即可。 - 可选优化:给添加子形状的逻辑套上独立的UndoScope,将整个操作包装为单个撤销单元,能进一步降低这类临时异常的出现概率,参考代码如下:
' 代码示例:用UndoScope包装添加子形状操作 Dim app As Visio.Application = Globals.ThisAddIn.Application Dim undoScope As Visio.UndoScope = Nothing Try undoScope = app.UndoManager.OpenUndoScope("添加子形状") ' 此处放置你原有的添加子形状的业务逻辑 Catch ex As System.Runtime.InteropServices.COMException ' 捕获Visio COM对象临时锁定的常见错误码,直接忽略即可 If ex.ErrorCode = &H8001010A OrElse ex.ErrorCode = &H80004005 Then Exit Try End If ' 其他非预期COM异常可以按需处理 Catch ex As Exception ' 其他业务异常处理逻辑 Finally ' 确保撤销scope正常提交 If undoScope IsNot Nothing AndAlso undoScope.IsOpen Then undoScope.Commit() End If End Try
内容的提问来源于stack exchange,提问作者DotNET Afficionado
相关产品推荐
相关产品推荐

