Lazarus (FreePascal): Wie kann ich capture system Fehler und wirft eine Ausnahme?
Ich versuche zu zeigen, eine Reihe von TPANELs verwendet werden, indem der Benutzer im Menü system. Es scheint alles zu funktionieren, aber hier ist das Problem.
Wenn ich immer auf das erste Element (d.h., TPanel), dann kann ich auf die anderen Dinge auch. Aber wenn ich Sie starten Sie durch klicken auf das Letzte Element, es zeigt die Fehlermeldung "Zugriffsverletzung" NACH hat gezeigt, die Elemente.
Das merkwürdige ist, dass trotz des Fehlers das system nicht zum Absturz. So aktivierte ich den debugger (DBG). Jetzt stürzt es mit der Fehlermeldung wie folgt:
Und sobald das Programm beendet, sehe ich Folgendes in der history-Fenster des Debuggers.
Bitte beachten Sie, dass bin ich nicht scharf rechts, nun in die Festsetzung dieser Fehler, wie ich denke, das ist trivial. Aber ich möchte in der Lage sein, den Fehler aufzuzeichnen, wie es dazu kommt und etwas tun (für die ich jetzt ignorieren wollen).
Ich bin mit Ubuntu 12.04 mit Lazarus 1.0.10.
Die Methode, die ich nutzen muss, funktionieren auf WINDOWS und LINUX.
Vielen Dank im Voraus für jede Hilfe!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Regel, fangen Sie eine Ausnahme, es ist die
try..except
block. Für Sie sicher, dass Ihr Ziel nicht ist, fangen Sie eine Ausnahme, und es ignorieren, aber finden Sie es in Ihrem code und beheben Sie die Ursache des Problems. Natürlich mag es Situationen geben, wo die Gefahr einer Ausnahme zu hoch ist oder zu erwarten, so dass die Verwendung einestry..except
block ist notwendig. Diese Blöcke von code wir sind umschließenden diese Weise:Dein problem wird irgendwo in einem
OnMouseUp
event-handler einige der Steuerelemente, und es ist verursacht worden durch den Zugriff auf den Speicher, dass die CPU nicht physisch-Adresse. Dies könnte z.B. passieren, wenn Sie auf ein Objekt zugreifen, welches noch nicht erstellt wurde, oder bereits veröffentlicht, aber es gibt auch viele verschiedene Möglichkeiten, wie eine Zugriffsverletzung verursachen.OnMouseUp
Ereignis (weilDoMouseUp
Methode, die der debugger-Geschichte berichtet nur feuert derOnMouseUp
Ereignis). Aber ich kann dir nicht helfen, mehr ohne zu sehen, den code...Zunächst ein großes Dankeschön an TLama für alle Erklärungen und Anweisungen. Ich habe zu akzeptieren, seine Antwort, als ich aufgebaut habe mir die Grundlage. Ich bin nur dieses posting als Antwort, so dass eine person, die ein Anfänger nach Lazarus können das nützlich finden. Ich bin nicht in sowieso was darauf hindeutet, dass dies die beste Sache zu tun, aber das ist, was ich will, jetzt zu tun. Das heißt, wenn eine bestimmte Ausnahme Auftritt, möchte ich dies behandeln und mit ihm umgehen.
Gegeben, dass
Nehmen wir an, es sind 10 solche "buttons" (eigentlich TPanels).
Problem:
Wenn ich den ersten Klick auf die erste Taste, die ich klicken kann auf eine andere (z.B.: die 5.). Aber wenn ich zuerst auf die 5. oder irgendetwas anderes als die erste, das Programm wirft die "Access violation" Fehler. Beachten Sie jedoch, dass das Programm doe nicht crash trotz der hässlichen Warnung über Daten-Korruption und so. So kann der Benutzer klicken Sie einfach auf ok und weiter. Seltsam dann, mit jedem weiteren Klick, dieses problem reduziert! Ich weiß, dass ist komisch.
Nun, wie erklärt, durch TLama, der Fehler tritt auf, wenn die Maus erscheint NACH dem Klick auf eine Schaltfläche.
Aber hier ist mein problem... ich habe nicht ein mouseup-Ereignis. Das ist ein Teil von Pascal.
So, jetzt möchte ich Sie zu ignorieren, das mouseup-event (zumindest für jetzt). Es MUSS einen besseren Weg geben.
Aber es gibt ein anderes Problem. Ich kann nicht ignorieren, was ich nicht haben! Und ich habe nicht ein mouseup-Ereignis. So entschied ich mich schließlich zur Erfassung dieser Fehler auf Anwendungsebene wie diese:
Auf dem Hauptformular habe ich diesen code:
Und dann auf Formular erstellen, ich habe diese:
- Und (für jetzt) ich kann dieses Thema umgehen.
Wieder einmal, wie TLama angedeutet hat, ist dies keine gute Beratung. Dennoch, es ist das, was ich tun wollte.
Außerdem, was macht es schwieriger ist, dass der Fehler Auftritt im mouseup, die in der Steuerung.inc. Und das ist nicht meine Datei. Vielmehr ist es Teil von Lazarus. Ich denke, es wäre besser, wenn wir eine Möglichkeit hatten zu sagen, Lazarus zu löschen, die Veranstaltung für die TPanels in den code. Ich denke, es geht wieder-schreiben Sie eine abgeleitete Klasse, und ich sehe nicht, wie, gut ist für mich jetzt 🙂
Nochmals vielen Dank TLama!