Невозможно поймать COMException (книга VB.net Excel.styles)

Я использую VB.net в MS Visual Studio 2012 для создания надстройки для Excel (2010, 2007). Надстройка использует стили Excel для форматирования отчетов. Вместо того, чтобы перебирать коллекцию стилей, я подумал, что будет проще попытаться получить ссылку на мой стиль по имени и перехватить исключение, если оно не существует.

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. Погуглил различные комбинации COMException, DISP_E_BADINDEX, workbook.styles и несколько форм «не удается поймать исключение».
  3. проверил, что флажок Thrown НЕ установлен для COMException в разделе Common Language Runtime Exceptions -> System.Runtime.InteropServices
  4. обработка его как исключения поврежденного состояния (CSE) добавив атрибут HandleProcessCorruptedStateExceptions
  5. Флажок Включить отладку собственного кода в разделе "Отладка" свойств проекта.

Я понимаю, что может быть лучше (и, возможно, даже быстрее) просмотреть всю коллекцию стилей в поисках соответствия _TitleStyleName, но я бы предпочел понять, почему я не смог просто Перехватите это исключение.

Спасибо, что нашли время, чтобы прочитать все это. :)


person Shadovv    schedule 07.03.2013    source источник
comment
Debug + Exceptions, убедитесь, что флажки Thrown не отмечены.   -  person Hans Passant    schedule 07.03.2013
comment
@ Ганс Спасибо. Я забыл упомянуть об этом в исходном вопросе. Я проверил, что флажок для COMException не установлен.   -  person Shadovv    schedule 07.03.2013


Ответы (1)


Я ЗНАЛ, что это должно быть что-то простое!

Я собирался перепроверить настройки исключений, предложенные Хансом Пассантом, но на первый взгляд я не увидел параметр "Исключения" в меню "Отладка". Вместо этого внизу я увидел Параметры и настройки. Это вызвало диалоговое окно «Параметры». В разделе Отладка -> Общие я обнаружил Break, когда исключения пересекают AppDomain или управляемые/собственные границы.

Я снял этот флажок, и теперь мой блок try/catch обрабатывает COMException, как и ожидалось!

РЕЗЮМЕ
Если у вас возникли проблемы с перехватом исключения, проверьте, не пересекает ли оно домен приложения или границу управляемого/собственного домена. Если да:
1) перейдите в меню Отладка
2) нажмите Параметры и настройки
3) перейдите в раздел Отладка - > раздел «Общие»
4) снимите флажок Разрывать, когда исключения пересекают домен приложения или управляемые/собственные границы

person Shadovv    schedule 11.03.2013