2011-01-20 4 views
2

Silverlight 4 앱에서 포함 된 컨트롤 (DataGrid)에서 함수를 호출하려고하는데이 함수는 때로는 MS.Internal.WrappedException의 가짜 예외를 throw합니다. 이 예외는 의미가 없기 때문에 그것을 삼킬 필요가 있습니다. 아쉽게도 예외는 System.Windows.dll에 internal class WrappedException : Exception으로 선언되어 있으므로 catch 블록에 이름을 지정할 수 없습니다.접근 할 수없는 예외를 처리 할 방법이 있습니까?

질문은이 예외를 감지하고 무시하는 가장 안전한 방법은 무엇입니까? 내가 가지고 올 한 두 가지 옵션은 다음과 같습니다 원래 예외

  1. 봐 : ex.GetType().FullName == "MS.Internal.WrappedException"

이 다른 쪽보다 더 나은 방법입니다 : 이름에 대한 ex.InnerException is InvalidOperationException

  • 봐? 내가 생각하지 못했던 다른 옵션이 있습니까?

    가 여기에 다양한 옵션을 보여주는 내 함수의 : 관심있는 사람들을 위해

    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; 
          } 
         } 
        } 
    

    을, 여기에 스택 트레이스의 :

     
        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의 프로퍼티

    하지만 주관적인 판단입니다. 그것은 어떻게 든 '해킹'이 덜 느끼고 미래 버전에서 깨질 가능성이 적습니다. Microsoft가 내부 랩퍼 클래스의 네임 스페이스 또는 클래스 이름을 변경하거나 랩핑하지 않고 InvalidOperationException을 던집니다.

    물론 예외적으로 예외가 발생하지 않도록 할 수 있습니다. 이미이 길을 다 써 버렸을 것입니다.

    +0

    'InternalException'의 소품을 확인해야할지 모르겠습니다. 메시지가 현지화되어 있으므로 쓸모가 없습니다. 확실히 스택 추적에 의존하고 싶지 않습니다! – Gabe

    6

    이것은 의도적 인 것이므로이 예외를 포착하려고하지 마십시오. 그것은 진지한 것입니다, 그것은 의미가 없습니다. 이 아니라면을 무시하십시오. 진짜 문제를 해결하십시오. 스택 추적없이 이유를 진단하는 것을 도와 드릴 수 없습니다.

    +0

    강력하게 동의합니다. 이것은 ScrollIntoView에 대한 호출이 실패하고 컨트롤을 잘못된 상태로 놓았을 수 있다는 DataGrid의 중요한 내부 예외입니다. 그것은 중요한 예외가 아니라면, 그것은 컨트롤에 심각한 버그 (덜 가능성이 있습니다.) –

    +0

    일단 예외가 무시되면 응용 프로그램이 잘 작동하고, 문제를 디버깅하는 방법에 대해 상상할 수는 없지만, 누군가가 도울 수있는 경우에 대비하여 스택 추적을 예외에서 게시했습니다. – Gabe

    +1

    @Gabe, DataGrid를 호출 해보십시오.UpdateLayout() ScrollIntoView() 호출하기 전에. 나는 약간의 독서를했으며 현재 ScrollIntoView()에 문제를 일으킬 수있는 가상화와 관련된 DataGrid에 알려진 버그가 있습니다. –

    0

    신경 쓰지 마세요. 실제로 전체 게시물을 읽어야합니다.

    나는 반사 (옵션 # 2)를 사용하여 투표 할 것입니다.

    나는 이것이 Microsoft에보고해야하는 버그라고 주장 할 것입니다. 어셈블리의 공개 인터페이스는 소비자에게 내부 또는 개인 예외를 던져서는 안됩니다.

    관련 문제