我在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
我已经尝试了一切我能想到的东西来捕捉这个“简单”的例外:
我意识到循环遍历整个Styles集合寻找与 _TitleStyleName 的匹配可能会更好(甚至可能更快),但我更愿意理解为什么我一直无法简单地抓住此例外。
感谢您抽出宝贵时间阅读所有这些内容。 :)
答案 0 :(得分:1)
我知道它必须简单!
我打算仔细检查Hans Passant建议的Exception设置,但乍一看我没有在调试菜单上看到Exceptions选项。相反,我在底部附近看到了选项和设置。这会打开“选项”对话框。在调试 - &gt; 常规部分,我发现在异常跨越AppDomain或托管/本机边界时中断。
我取消选中该框,现在我的try / catch块按预期处理COMException!
<强>概要强>
如果您在捕获异常时遇到问题,请查看它是否跨越AppDomain或托管/本机边界。如果是的话:
1)转到调试菜单
2)点击选项和设置
3)转到调试 - &gt;一般部分
4)取消选中当异常跨越AppDomain或托管/本地边界时中断