Forum: PC-Programmierung XML Reader exception handling


von Teymur (Gast)


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?

von Peter II (Gast)


Lesenswert?

teste mal mit

xr->Dispose();

nach dem close.

von Teymur (Gast)


Lesenswert?

1>xml_parser.cpp(99): error C2039: 'Dispose': Ist kein Element von 
'System::Xml::XmlReader'
Sie sollten stattdessen den Destruktor, "~XmlReader", aufrufen.

delete xr; hilft aber auch nicht

von Peter II (Gast)


Lesenswert?

an welcher stelle kann der nutzer die Datei bearbeiten? innerhalb des 
Catch block oder später?

von Teymur (Gast)


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.

von Peter II (Gast)


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.

von Teymur (Gast)


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

von Peter II (Gast)


Lesenswert?

und wo schließt du die Datei?

von Joe R. (joer)


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.

von Teymur (Gast)


Lesenswert?

OOOOOh F#CK!!!

Danke :)

Habe einfach diese Zeile gelöscht, ich muss die Datei ja gar nicht 
öffnen, ich brauche nur den Pfad :)

Danke nochmal!

von Teymur (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.