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

Я использую VB.net в MS Visual Studio 2012 для создания надстройки для 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. Погуглил различные комбинации COMException, DISP_E_BADINDEX, workbook.styles и несколько форм "не могу поймать исключение"
  3. проверил, что брошенный флажок НЕ проверен для COMException под Общими исключениями языка исполнения -> System.Runtime.InteropServices
  4. обрабатывая его как исключение поврежденного состояния (CSE), добавляя атрибут HandleProcessCorruptedStateExceptions
  5. Установите флажок Включить отладку собственного кода в разделе "Отладка" свойств проекта.

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

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

1 ответ

Я знал, что это должно быть что-то простое!

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

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

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

Другие вопросы по тегам