В приложении Silverlight 4 я вызываю функцию во включенном элементе управления (DataGrid), и эта функция иногда вызывает ложное исключение типа MS.Internal.WrappedException
.Поскольку это исключение не имеет смысла, мне нужно его проглотить.К сожалению, исключение объявлено internal class WrappedException : Exception
в System.Windows.dll, поэтому я не могу назвать его в блоке catch
.
Вопрос в том, какой самый безопасный способ обнаружить это исключение иигнорируй это?Я выбрал два варианта:
- Ищите оригинальное исключение:
ex.InnerException is InvalidOperationException
- Ищите имя:
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)