在Silverlight 4应用程序中,我在包含的控件(DataGrid)上调用函数,此函数有时会抛出MS.Internal.WrappedException
类型的虚假异常。由于这个例外没有意义,我需要吞下它。不幸的是,异常在System.Windows.dll中声明为internal class WrappedException : Exception
,因此我无法在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)
答案 0 :(得分:6)
这是故意的,所以你不要试图捕捉这个例外。这是一个严肃的,它没有意义,不忽略它。解决真正的问题。如果没有堆栈跟踪,我无法帮助您诊断原因。
答案 1 :(得分:2)
我更喜欢ex.InnerException is InvalidOperationException
的测试,也可能检查InnerException的一些属性。
InvalidOperationException
而不包装它?
当然,理想情况下,你可以阻止异常被抛出。我相信你已经筋疲力尽了。
答案 2 :(得分:0)
没关系。我应该读完整篇文章。
我投票支持使用反射(选项#2)。
我认为这是应该向Microsoft报告的错误:程序集的公共接口不应该向其使用者抛出内部或私有异常。