Exceptions verhindern
-
Guten Abend,
bei mir erscheinen Exceptions, wobei es danach problemlos weitergeht. Ich hatte danach noch keine Probleme jeglicher Art. Da es mir leider nicht gelungen ist, die Exceptions ausfindig zu machen (es funktioniert ja, und unlogisch sind die noch dazu), würde ich sie gern einfach vom Builder ignorieren lassen. Kann ich das machen, ohne in den Projektoptionen das Exceptionshandling dezuaktivieren.
Versucht habe ich:
catch ( ... ) { // }
Das funktioniert anscheind für die enderzeugte Exe, aber solange ich im Nicht-Standalone-Exe-modus arbeite, kommen trotzdem (anscheinend) Builderinterne Exceptions, die mich einfach nervern und an der Stelle keine Ursache für irgendwelche Probleme zeigen!
-
Ich nehme mal an, dass die Exceptions nur auftreten, wenn du deine Anwendung aus der IDE heraus startest.
Versuch mal deine Anwendung aus dem Explorer direkt zu starten.
Wenn dann immer noch die Exceptions auftreten, dann liegen doch schwerwiegendere Probleme vor.Normalerweise kannst du aber herausfinden, welche Exception ausgelöst wurde, da diese in der Meldung genannt wird (wenn du die Anwendung aus der IDE heraus startest).
Du kannst auch einstellen, dass bestimmte Exceptions nicht von der IDE behandelt werden sollen. Dazu gibt's im Builder unter "Tools->Debugger-Optionen" die Möglichkeit unter "Sprach-Exceptions" die gewünschten Exceptions abzuschalten.
-
Kann ich auch Stacküberläufe abschalten? (Keine Angst, das schlechte Gewissen liegt auf meiner Seite...), aber an dieser Stelle, wo so ein Stacküberlauf auftritt, funktioniert alles (wirklich) problemlos und ich und ein externer Betrachter kamen nicht hinter des Rätsels Lösung. Wie kann ich also Anzeigen von Stack-Überläufen verhindern? (am besten auch nach dem start aus der IDE)
-
also das würde mich hochgrad beunruhigen! Entweder hast Du zu wenige Stackspeicher reservieren lassen oder Du hast jede Menge rekursive Aufrufe. Oder, was auch möglich ist, Du belegst riesige Speicherbereiche auf dem Stack, was man nicht machen sollte, da der Stack nur für Arbeitsvariablen und kleine Strukturen/Klassen da ist und nicht für die komplette Datenablage eines Programms.
Vielleicht könnten wir Dir ja helfen, das Problem einzukreisen, wenn Du mehr von Deinem Programm erzählst. Was macht es, wie groß ist es, wieviele Klassen verwendet es.
Es gibt hier sicher bessere C++ Gurus, die wissen, was bei einer Stack-Excpetion auftritt. Im besten Fall kriegst Du das nur innerhalb der IDE als Warnhinweis angezeigt und der Stack wird einfach automatisch vergrößert. Aber normal würde ich das keinesfalls nennen!
Einfach eine Warnung abschalten, löst schließlich nicht immer das Problem. Wenn Du in Deinem Auto das Licht für die angezogene Handbremse siehst, wirst Du ja sicher auch nicht das Lämpchen deaktivieren, sondern lieber die Handbremse lösen wollen. Und so ähnlich ist das auch mit Exceptions.
-
Gut, ich bin jede Codezeile der Umgebung durchgegangen, und bin letztendlich zu folgender Zeile gekommen, die definitiv den Stacküberlauf erzeugt hat:
AnsiString test = LoadStr( filename );
Dieser Stacküberlauf tritt nur bei Dateien (filename) mit sehr großen Daten auf; klar, weil wahrscheinlich der AnsiString oder der Speicher nicht mehr aufnehmen kann. Die Datei, bei der ich das bis jetzt gemerkt habe, ist ca. 9000 Zeilen groß zu je 50 Zeichen. Ich habe nicht den schlechtesten und überhaupt wäre es schlimm, wenn ich nicht den Dateiinhalt in so einen AnsiString bekäme. Ohne diese Funktion ist damit auch mein Gesamtproblem nur für kleine Dateien möglich
... Irgendwie muss das doch gehen!?
-
TFileStream?!?
-junix
-
Ok, also es handelt sich hier um eine Delphikomponente, wobei folgende Zeilen für das Problem relevant sind:
procedure Txtra2.LoadFile(filename: string);
begin
Fxtra:=loadstring(filename);
FParseError:=parse;
end;Fxtra ist ein AnsiString, der "global" private in der zugehörigen Klasse deklariert wurde. Diese Variable wird bei diversen Routinen ständig für Stringoperationen verwendet. Wenn ich da irgendwie mit TFileStream rein"pfusche", klappt das doch nicht, weil wenn ich das wieder in ein AnsiString konvertiere, kommt ja wieder der Stacküberlauf
-
Erstell den AnsiString mal mit new, damit er auf dem heap landet...
-junix
-
wie geht das in pascal? ich muss ja hier die komponente anpassen!
-
Diese Frage solltest du in einem ObjectPascal (Delphi) Forum stellen...
-junix
-
Probier doch mal, die Datei Zeilenweise einzulesen in eine Stringliste!
vorher mit new TStringlist() erzeugen, am ende deleten.
da landen die Daten auf'm Heap, davon haste (hoffentlich) genug.(Deine Datei mit 450 000 Byte auf einmal ist bissl viel)