有没有办法处理无法访问的异​​常?

时间:2011-01-20 20:51:49

标签: c# silverlight exception

在Silverlight 4应用程序中,我在包含的控件(DataGrid)上调用函数,此函数有时会抛出MS.Internal.WrappedException类型的虚假异常。由于这个例外没有意义,我需要吞下它。不幸的是,异常在System.Windows.dll中声明为internal class WrappedException : Exception,因此我无法在catch块中命名。

问题是,检测此异常并忽略它的最安全的方法是什么?我提出的两个选项是:

  1. 查找原始例外:ex.InnerException is InvalidOperationException
  2. 查找名称:ex.GetType().FullName == "MS.Internal.WrappedException"
  3. 一种方式比另一方好吗?还有其他我没想过的选择吗?

    这是我的功能,显示了不同的选项:

        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 个答案:

答案 0 :(得分:6)

这是故意的,所以你不要试图捕捉这个例外。这是一个严肃的,它没有意义,忽略它。解决真正的问题。如果没有堆栈跟踪,我无法帮助您诊断原因。

答案 1 :(得分:2)

我更喜欢ex.InnerException is InvalidOperationException的测试,也可能检查InnerException的一些属性。

但是,这是一个主观判断。它在某种程度上感觉不那么'hacky',也许不太可能在未来的版本中打破。您是否认为Microsoft更有可能更改其内部包装类的命名空间或类名,或者只是抛出InvalidOperationException而不包装它?

当然,理想情况下,你可以阻止异常被抛出。我相信你已经筋疲力尽了。

答案 2 :(得分:0)

没关系。我应该读完整篇文章。

我投票支持使用反射(选项#2)。

我认为这是应该向Microsoft报告的错误:程序集的公共接口不应该向其使用者抛出内部或私有异常。