无法捕获COMException(VB.net Excel workbook.styles)

时间:2013-03-07 18:26:16

标签: vb.net styles try-catch excel-interop comexception

我在MS Visual Studio 2012中使用VB.net来创建Excel的加载项(2010年,2007年)。该加载项使用Excel的样式来格式化报表。而不是遍历Styles集合,我认为通过名称尝试获取对我的样式的引用会更容易,如果它不存在则捕获异常。

Imports xi = Microsoft.Office.Interop.Excel

<ComVisible(True)> _
<ClassInterface(ClassInterfaceType.None)> _
Public Class ReportOptions
    Implements IReportOptions

    Private Const _TitleStyleName As String = "TitleStyle"
    Private Const _SubtitleStyleName As String = "SubtitleStyle"

    Public Sub SetDefaults() Implements IReportOptions.SetDefaults
        Dim MyApp As xi.Application
        Dim wb As xi.Workbook
        Dim styles As xi.Styles
        Dim SubtitleStyle As xi.Style
        Dim TitleStyle As xi.Style

        MyApp = GetObject(, "Excel.Application")
        wb = MyApp.ActiveWorkbook
        styles = wb.Styles
        Try
            SubtitleStyle = styles.Item(_SubtitleStyleName) 'Exception here
        Catch ex As COMException
            SubtitleStyle = styles.Add(_SubtitleStyleName)
        End Try

        TitleStyle.Font.Name = "Calibri"
        'More code setting style values

        'Code to clean up the COM Objects...
    End Sub
End Class

我不断获取Visual Studio的“COMException越过本地/管理边界”的异常对话框,其中包含以下详细信息:

Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))
at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
at Microsoft.Office.Interop.Excel.Styles.get_Item(Object Index)
at ReportClassLibrary.ReportClassLibrary.ReportOptions.SetDefaults() in <Path>\ReportClassLibrary.vb:line 68

我已经尝试了一切我能想到的东西来捕捉这个“简单”的例外:

  1. 臭名昭着的全能“Catch ex As Exception”,或“Catch”
  2. 用Google搜索COMException,DISP_E_BADINDEX,workbook.styles以及“无法捕获异常”的几种形式的各种组合
  3. 验证在公共语言运行时异常 - &gt;下检查了“抛出”复选框是否存在COMException。 System.Runtime.InteropServices
  4. 通过添加 HandleProcessCorruptedStateExceptions 属性
  5. 将其视为损坏状态异常(CSE)
  6. 在项目属性
  7. 的“调试”部分中选中启用本机代码调试

    我意识到循环遍历整个Styles集合寻找与 _TitleStyleName 的匹配可能会更好(甚至可能更快),但我更愿意理解为什么我一直无法简单地抓住此例外。

    感谢您抽出宝贵时间阅读所有这些内容。 :)

1 个答案:

答案 0 :(得分:1)

我知道它必须简单!

我打算仔细检查Hans Passant建议的Exception设置,但乍一看我没有在调试菜单上看到Exceptions选项。相反,我在底部附近看到了选项和设置。这会打开“选项”对话框。在调试 - &gt; 常规部分,我发现在异常跨越AppDomain或托管/本机边界时中断

我取消选中该框,现在我的try / catch块按预期处理COMException!

<强>概要
如果您在捕获异常时遇到问题,请查看它是否跨越AppDomain或托管/本机边界。如果是的话:
1)转到调试菜单
2)点击选项和设置
3)转到调试 - &gt;一般部分
4)取消选中当异常跨越AppDomain或托管/本地边界时中断