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



我在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 -all "Catch ex As Exception""Catch"
  2. 谷歌COMException, DISP_E_BADINDEX, workbook的各种组合。样式,以及几种形式的"can't catch exception"
  3. 已验证:Common Language Runtime Exceptions -> System.Runtime.InteropServices
  4. 通过添加HandleProcessCorruptedStateExceptions属性
  5. 将其作为损坏状态异常(CSE)处理
  6. Checked 在Project Properties
  7. 的Debug部分开启本机代码调试

我意识到它可能更好(甚至可能更快)通过整个样式集合寻找匹配_TitleStyleName,但我更愿意理解为什么我不能简单地捕捉这个异常。

感谢您花时间阅读所有这些。:)

我知道它必须是简单的东西!

我打算按照Hans Passant的建议仔细检查Exception设置,但乍一看,我没有在Debug菜单上看到Exceptions选项。相反,我看到选项和设置接近底部。这将弹出选项对话框。在调试 -> 一般部分,我发现当异常跨越AppDomain或托管/本机边界时中断。

我选中了那个框,现在我的try/catch块按预期处理COMException !


如果你在捕捉异常时遇到困难,看看它是否跨越了AppDomain或托管/本地边界。如果是:
1)进入Debug菜单
2)点击选项和设置
3)进入Debugging -> General部分
4)当异常跨越AppDomain或托管/本机边界

时取消勾选Break

相关内容

  • 没有找到相关文章

最新更新