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?
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
an welcher stelle kann der nutzer die Datei bearbeiten? innerhalb des Catch block oder später?
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.
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.
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(); } }
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.