Есть ли способ обработать недоступное исключение? - PullRequest
2 голосов
/ 20 января 2011

В приложении Silverlight 4 я вызываю функцию во включенном элементе управления (DataGrid), и эта функция иногда вызывает ложное исключение типа MS.Internal.WrappedException.Поскольку это исключение не имеет смысла, мне нужно его проглотить.К сожалению, исключение объявлено internal class WrappedException : Exception в System.Windows.dll, поэтому я не могу назвать его в блоке catch.

Вопрос в том, какой самый безопасный способ обнаружить это исключение иигнорируй это?Я выбрал два варианта:

  1. Ищите оригинальное исключение: ex.InnerException is InvalidOperationException
  2. Ищите имя: ex.GetType().FullName == "MS.Internal.WrappedException"

Один путь лучше другого?Есть ли другой вариант, о котором я не думал?

Вот моя функция, показывающая различные варианты:

    private void SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var selectedAlarm = alarmList.SelectedItem as Alarm;
        if (selectedAlarm != null)
        {
            dataGrid.SelectedItem = selectedAlarm.Source;
            try
            {
                dataGrid.ScrollIntoView(dataGrid.SelectedItem, null);
            }
            // catch (MS.Internal.WrappedException ex) doesn't compile
            catch (Exception ex)
            {
                if (ex.InnerException is InvalidOperationException) // 1
                if (ex.GetType().FullName == "MS.Internal.WrappedException") // 2
                {
                    // ignore exception
                }
                else
                    throw;
            }
        }
    }

Для тех, кто заинтересован, вот StackTrace:

   at MS.Internal.XcpImports.CheckHResult(UInt32 hr)
   at MS.Internal.XcpImports.UIElement_Measure(UIElement element, Size availableSize)
   at System.Windows.UIElement.Measure(Size availableSize)
   at System.Windows.Controls.DataGrid.InsertDisplayedElement(Int32 slot, UIElement element, Boolean wasNewlyAdded, Boolean updateSlotInformation)
   at System.Windows.Controls.DataGrid.InsertDisplayedElement(Int32 slot, Boolean updateSlotInformation)
   at System.Windows.Controls.DataGrid.GetExactSlotElementHeight(Int32 slot)
   at System.Windows.Controls.DataGrid.ScrollSlotIntoView(Int32 slot, Boolean scrolledHorizontally)
   at System.Windows.Controls.DataGrid.ScrollSlotIntoView(Int32 columnIndex, Int32 slot, Boolean forCurrentCellChange, Boolean forceHorizontalScroll)
   at System.Windows.Controls.DataGrid.ScrollIntoView(Object item, DataGridColumn column)
   at DtDemo.Home.alarmList_SelectionChanged(Object sender, SelectionChangedEventArgs e)

и вот InnerException.StackTrace:

   at System.Windows.Controls.DataGridRow.get_ActualDetailsVisibility()
   at System.Windows.Controls.DataGridRow.OnApplyTemplate()
   at System.Windows.FrameworkElement.OnApplyTemplate(IntPtr nativeTarget)

Ответы [ 3 ]

6 голосов
/ 21 января 2011

Это намеренно, поэтому вы не пытаетесь поймать это исключение. Это серьезный, не лишенный смысла, не игнорируйте его. Исправьте настоящую проблему. Я не могу помочь вам диагностировать причину без трассировки стека.

2 голосов
/ 21 января 2011

Я бы предпочел тест для ex.InnerException is InvalidOperationException, а также, возможно, проверку некоторых свойств InnerException.

Хотя это субъективное суждение.Он почему-то чувствует себя менее «хакерским» и, возможно, с меньшей вероятностью сломается в будущей версии.Считаете ли вы, что Microsoft с большей вероятностью изменит пространство имен или имя класса своего внутреннего класса-оболочки, или сделает что-то вроде простого выброса InvalidOperationException без переноса?

Конечно, в идеале вы могли бы остановить исключение избыть брошенным в первую очередь.Я уверен, что вы уже исчерпали этот маршрут.

0 голосов
/ 21 января 2011

Неважно.На самом деле я должен прочитать весь пост.

Я бы проголосовал за использование рефлексии (вариант # 2).

Я бы сказал, что это ошибка, о которой следует сообщать Microsoft: общедоступный интерфейссборки не должно вызывать внутренние или частные исключения для ее потребителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...