2011-01-20 14 views
2

Silverlight 4アプリケーションでは、インクルードコントロール(DataGrid)で関数を呼び出していますが、この関数はタイプがMS.Internal.WrappedExceptionの偽の例外をスローすることがあります。この例外は意味がないので、私はそれを飲み込む必要があります。残念ながら、例外はSystem.Windows.dll内でinternal class WrappedException : Exceptionと宣言されているため、catchブロックに名前を付けることはできません。アクセスできない例外を処理する方法はありますか?

質問は、この例外を検出して無視する最も安全な方法は何ですか?私が作ってみた2つのオプションがあります。元の例外のための

  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) 

答えて

2

I ex.InnerException is InvalidOperationExceptionのテストが好きで、おそらくInnerExceptionのプロパティ

しかし、それは主観的な判断です。それはどういうわけか、「ハッキー」が少なく感じられ、将来のバージョンでは壊れにくいかもしれません。マイクロソフトでは、内部ラッパークラスの名前空間やクラス名を変更する可能性が高いと思われますか、それともラップせずにInvalidOperationExceptionを投げるようなことをしますか?

もちろん、最初に例外がスローされるのを防ぐことができます。私はあなたがすでにこのルートを使い果たしていると確信しています。

+0

私は 'InternalException'のどの小道具を調べるべきか分かりません。メッセージはローカライズされているため、無用です。私は確かにスタックトレースに依存したくない! – Gabe

6

これは意図的なので、この例外をキャッチしようとしないでください。それは重大なものです、無意味ではありません、ではないそれを無視してください。本当の問題を修正してください。私はあなたがスタックトレースなしの理由を診断するのを手助けすることはできません。

+0

私は強く同意します。これは、ScrollIntoViewへの呼び出しが失敗し、コントロールが無効な状態になっている可能性があることを示すDataGridの重要な内部例外です。それは重大な例外ではない場合は、コントロールの深刻なバグです(これはあまりありません) –

+0

例外が無視されるとアプリは正常に動作し、問題のデバッグ方法を想像することはできませんが、誰かが助けることができるように、例外からスタックトレースを投稿しました。 – Gabe

+1

@Gabe、DataGridを呼び出してみてください。ScrollIntoView()の呼び出しの前にUpdateLayout()を呼び出します。私はいくつかの読書をしましたが、ScrollIntoView()で問題を引き起こす可能性のある仮想化に関するDataGridの既知のバグがあります。 –

0

気にしないでください。私は実際に投稿全体を読むべきです。

私は反射を使用して投票します(オプション#2)。

これはMicrosoftに報告する必要があるバグであると主張します。アセンブリのパブリックインターフェイスは、コンシューマに対して内部例外またはプライベート例外を投げてはいけません。

関連する問題