2016-11-18 11 views
1

をキャッチされていない私は定義された私のカスタム例外:C#のユーザー定義の例外が

[Serializable] 
    public class WrongFileException : Exception 
    { 
     public WrongFileException() 
     { 

     } 
     public WrongFileException(string message) : base(message) 
     { 

     } 

     public WrongFileException(string message, Exception innerExeException) : base(message, innerExeException) 
     { 

     } 
    } 

私は、ファイルを開くボタンがあり、それは間違っているファイルだとき、私は例外をスローします:

private void PanelOpen_Click(object sender, RoutedEventArgs e) 
    { 
     Microsoft.Win32.OpenFileDialog opendlg = new Microsoft.Win32.OpenFileDialog(); 
     opendlg.DefaultExt = ".xml"; 
     opendlg.Filter="XML Files|*.xml"; 

     Nullable<bool> result = opendlg.ShowDialog(); 

     if (result == true) 
     { 
      XmlSerializer XMLSerial = new XmlSerializer(typeof(List<Panel>)); 
      FileStream fsCheck = new FileStream(opendlg.FileName, FileMode.Open); 
      XmlReader reader = new XmlTextReader(fsCheck); 
      fsCheck.Close(); 
      if (!XMLSerial.CanDeserialize(reader)) 
      { 
       throw (new WrongFileException("Wrong data sructure for PanelList")); 
      } 
      try 
      { 
       using (FileStream fsRead = new FileStream(opendlg.FileName, FileMode.Open, FileAccess.Read)) 
       { 
        PanelList = XMLSerial.Deserialize(fsRead) as List<Panel>; 
       } 
       PanelBoxListView.ItemsSource = PanelList; 
       PanelBoxListView.Items.Refresh(); 
      } 
      catch(WrongFileException q) 
      { 
       MessageBox.Show("WrongFileException: {0}", q.Message); 
       throw; 
      } 
     } 
     CheckForListEntries(); 
    } 

動作しないファイルで開こうとしているテスト "WrongFileExceptionが未処理です"というメッセージが表示されます。なぜ私は例外をキャッチしているので、私はなぜ取得していないのですか?

+4

キャッチするために、例外は '試行'ブロックからスローされなければなりません。 –

+1

Y catch文は関連する 'try'ブロックによって引き起こされた例外のみを処理できます。あなたのシリアライザ文*をtryブロックとdoneに入れてください。 – HimBromBeere

+0

@GabrielNegutこれは答えであり、コメントではありません。あなたが答えとしてそれを書くなら、私は私を取り除くことができます。 –

答えて

2

tryブロック内に例外がスローされた場合にのみキャッチします。

  try 
      { 
       if (!XMLSerial.CanDeserialize(reader)) 
       { 
        throw (new WrongFileException("Wrong data sructure for PanelList")); 
       } 
       using (FileStream fsRead = new FileStream(opendlg.FileName, FileMode.Open, FileAccess.Read)) 
       { 
        PanelList = XMLSerial.Deserialize(fsRead) as List<Panel>; 
       } 
       PanelBoxListView.ItemsSource = PanelList; 
       PanelBoxListView.Items.Refresh(); 
      } 
      catch(WrongFileException q) 
      { 
       MessageBox.Show("WrongFileException: {0}", q.Message); 
       throw; 
      } 
+0

これはcatchブロックで例外をキャッチし、メッセージボックスが表示されます。しかし、私は再び例外を再スローすることによって再びクラッシュすると思います。 –

+0

@ krw12572:確かに!、それはトラックの下で処理されていない限り。 – CharithJ

+0

しかし、それはOPがそれを意図した方法のようだ... –

1

あなたthrow (new WrongFileException(...));tryブロックなので、tryからcatchは、関連するなりません。

関連する問題