2016-11-18 5 views
1
gefangen

ich so meine benutzerdefinierte Ausnahme definiert:C# benutzerdefinierte Ausnahme nicht

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

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

     } 

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

     } 
    } 

Ich habe einen Knopf, der eine Datei öffnet und ich möchte eine Ausnahme werfen, wenn es die falsche Datei ist:

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

Testen Sie es versuchen, mit einer Datei zu öffnen, die nicht funktioniert Ich bekomme "WrongFileException wurde nicht behandelt". Ich verstehe nicht warum, weil ich die Ausnahme erhalte?

+4

Die Ausnahme muss aus dem "try" -Block geworfen werden, um abgefangen zu werden. –

+1

Y catch-statement kann nur jene Ausnahmen behandeln, die durch den 'try'-Block verursacht wurden, auf den sie sich beziehen. Setzen Sie Ihre Serializer-Anweisungen * in den try-Block und fertig. – HimBromBeere

+0

@GabrielNegut Das ist die Antwort, kein Kommentar. Wenn Sie es als Antwort schreiben, kann ich meine entfernen. –

Antwort

2

Es fängt nur, wenn die Ausnahme innerhalb try Block geworfen wird.

  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

Nun, dies wird Ausnahme in catch-Block fangen und Message Box wird angezeigt. Aber, ich denke, es wird wieder abstürzen, indem er erneut die Ausnahme auslöst. –

+0

@ krw12572: Sicher !, Es sei denn, es ist nicht auf der Spur behandelt. – CharithJ

+0

Aber scheint so, wie OP es beabsichtigt hat ... –

1

Ihre throw (new WrongFileException(...)); ist vor der try Block, so dass die try-catch nie relevant wird.

Verwandte Themen