无法捕获COMException(VB.net Excel工作簿.styles)

无法捕获COMException(VB.net Excel工作簿.styles),vb.net,styles,try-catch,excel-interop,comexception,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)> _ Publi

我正在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
<代码>导入席=微软办公软件 _ _ 公共类报告选项 实现IReportOptions Private Const_TitleStyleName As String=“TitleStyle” Private Const_SubtitleStyleName As String=“SubtitleStyle” Public Sub SetDefaults()实现IReportOptions.SetDefaults 席MyApp作为XI应用 作为工作席的DWB 席式风格 席风格风格 席式风格 MyApp=GetObject(,“Excel.Application”) wb=MyApp.ActiveWorkbook styles=wb.styles 尝试 SubtitleStyle=styles.Item(\u SubtitleStyleName)在此处出现异常 作为例外捕获 SubtitleStyle=样式。添加(\u SubtitleStyleName) 结束尝试 TitleStyle.Font.Name=“Calibri” '更多代码设置样式值 '清除COM对象的代码。。。 端接头 末级 我不断收到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
索引无效。(HRESULT的例外:0x8002000B(显示索引))
位于System.RuntimeType.ForwardCallToInvokeMember(字符串memberName、BindingFlags标志、对象目标、Int32[]aWrapperTypes、MessageData和msgData)
在Microsoft.Office.Interop.Excel.Styles.get_项(对象索引)中
在\ReportClassLibrary.vb中的ReportClassLibrary.ReportClassLibrary.ReportOptions.SetDefaults()处:第68行
为了抓住这个“简单”的例外,我想尽一切办法:

  • 臭名昭著的catch all“catch ex As Exception”,或“catch”
  • 谷歌搜索了COMException、DISP_E_BADINDEX、workbook.styles和几种形式的“无法捕捉异常”的各种组合
  • 已验证在公共语言运行时异常->System.Runtime.InteropServices下未选中抛出复选框的COMException
  • 通过添加HandleProcessCorruptedStateExceptions属性,将其视为损坏状态异常
  • 选中项目属性的调试部分中的启用本机代码调试
  • 我意识到在整个样式集合中循环查找与\u TitleStyleName匹配的样式可能会更好(甚至更快),但我更愿意理解为什么我无法简单地捕获此异常


    感谢您抽出时间阅读本文。:)

    我知道一定要简单点

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

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

    摘要
    如果捕获异常时遇到问题,请查看它是否跨越AppDomain或托管/本机边界。如果有:
    1) 转到调试菜单
    2) 单击选项和设置 3) 转到调试->常规部分

    4) 当异常跨越AppDomain或托管/本机边界时,取消选中“中断”

    我知道它必须是简单的

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

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

    摘要
    如果捕获异常时遇到问题,请查看它是否跨越AppDomain或托管/本机边界。如果有:
    1) 转到调试菜单
    2) 单击选项和设置 3) 转到调试->常规部分

    4) 当异常跨越AppDomain或托管/本机边界时,取消选中“中断”。

    调试+异常,确保未勾选抛出的复选框。@Hans谢谢。我在原来的问题中忘了提到这一点。我已验证COMException的复选框未选中。调试+异常,请确保未勾选抛出的复选框。@Hans谢谢。我在原来的问题中忘了提到这一点。我已确认COMException的复选框未选中。