XML Reader exception handling

Gast #2204186
Lesenswert?

Hallo!

Ich schreibe in Visual C++/CLI einen XML-Parser. Der Funktioniert auch, 
soweit alles gut. Probleme fangen an, wenn ich einen Benutzer warnen 
will, dass XML-file nicht korrekt ausgefühlt wurde. Aber zuerst 
einbisschen Code:
[code]

XmlReader^ xr = nullptr;
try
{
   xr = XmlReader::Create(filename, settings);
   while (xr->ReadToFollowing("bla"))
   {
   //Hier wird geparst...
   }
}
catch(Exception^)
{
     throw gcnew System::InvalidOperationException("Selected File 
couldnot be parsed!");
}
finally
{
   if(xr)
   {
      xr->Close();
   }
}
[\code]


Wenn keine Ausnahme aufgetreten ist - läuft alles korrekt ab. Falls 
jedoch eine Ausnahme auftritt, wird Benutzer gewarnt. Nun möchte der 
Benutzer .xml-file editieren, und nochmal versuchen, ohne mein Programm 
zu schliesen. Speichern funktioniert aber nicht, weil "Datei wird von 
einem anderen Prozess verwendet".

Habt ihr eine Idee woran das liegen kann?
Gast #2204198
Lesenswert?

Nein, xml-Datei soll im beliebigen Editor bearbeitet werden können. Mein 
Programm läuft. Paralell dazu läuft Notepad++. Solangt alles prima 
läuft, kann ich xml-Datei editieren und speichern. Sobald ich falsche 
Eingaben mache, werde ich gewarnt, kann aber die Eingaben nicht 
korrigieren und speichern, muss erst mein Programm schließen und wieder 
öffnen, weil xml-Datei "gelockt" bleibt.
Gast #2204199
Lesenswert?

dann schein es wohl ein Problem mit dem XML Reader zu geben, das er die 
Datei nicht schießt. du könntest versuchen die Datei selber zu öffnen 
und dem xml reader nur den Stream zu geben. Dann kannst du die datei 
auch selber schließen.
Gast #2204218
Lesenswert?

Habe das probiert, immernoch kein Erfolg.

Vielleicht liegt mein Fehler höher?

Hier ist die Funktion, die den xml-parser aufruft

if (ofd->ShowDialog() == System::Windows::Forms::DialogResult::OK)
{
   try
   {
      if (ofd->OpenFile() != nullptr )
      {
         xml_parser1->parse_file(ofd->FileName);
         // weitere Funktionsaufrufe, die mit parser nix zutun haben
      }

   }
   catch(Exception^ e)
   {
      status_box->AppendText(e->Message + Environment::NewLine);
   }
   finally
   {
      xml_parser1->delete_parameters();
   }
}
#2204239
Lesenswert?

Teymur schrieb:
> catch(Exception^)
> {
>      throw gcnew System::InvalidOperationException("Selected File
> couldnot be parsed!");
> }

Ich denke das throw gehört nicht in den catch Block...
Das muss in der try Block da das throw die exception ja erst auslöst.

Wenn Du im catch ein throw machst sucht es sich den nächsten catch 
Handler und der kann schon im System sein. Das Programm scheint 
abzustürzen und fliegt in den globalen Handler wenn kein weiterer 
Handler definiert ist.
Gast #2204245
Lesenswert?

Joe Redfish schrieb:
>Ich denke das throw gehört nicht in den catch Block...
>Das muss in der try Block da das throw die exception ja erst auslöst.

Dadurch fängt man alle möglichen Exceptions ab, und löst nur eine 
einzige aus.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren