2016-11-18 91 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

必须从'try'块引发异常才能被捕获。 –

+1

Y catch-statement只能处理由它们涉及的'try'-block引起的异常。把你的序列化程序语句*放到try-block中,然后完成。 – 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永远不会成为相关。