Hi,
nur die Daten kopieren hätte den Nachteil, dass spezielle Eigenschaften spezieller Exceptions ignoriert würden. Oder war gemeint, einfach die Instanz der
Exception zuzuweisen (da du Message := OldException geschieben hast, Message ist ja ein String-Property, das würde so also gar nicht gehen). Beim speichern der Instanz wäre das Problem mit dem Freigeben.
Ein if Silent then ... geht am eigentlichen Problem dabei, denn an übergeordneter Stelle wären solche Exceptions 1. nicht mehr abfangbar und 2. ist dort gar nicht bekannt, ob sie still sein sollten (falls dort das if silent then hinkommen sollte).
Der Vergleich mit dem Auto hat ein kleines Problem. Würdest du bei einem Unfall zum Bescheid sagen einen weiteren Unfall riskieren?
Nehmen wir an, irgendwo auf einer Komponente wird ein Bild gezeichnet, und es tritt eine
Exception auf, eine Meldung wird angezeigt. Der User klickt auf OK, die Komponente ist nicht mehr von der MessageBox verdeckt und so muss das Bild neu gezeichnet werden, was wieder fehlschlägt. Natürlich ließe sich für diesen Fall speichern, dass dieses Bild irgendwie defekt ist, aber das wäre ein beispiel, wo man auch solche stillen Exceptions nehmen könnte. Und das würde eventuell trotzdem beim nächsten Bild (falls diese wechseln, da ein Fehler davon noch nicht bekannt ist) möglicherweise wieder zu einer
Exception führen. Beispielsweise bei einer defekten Diskette oder CD.
Oder es werden Zeitabhängig bestimmte Dinge getan (einfachstes Beispiel wäre ein Timer) und dort treten ab und zu Exceptions auf. Das wäre richtig nervend für den User, da er dann eventuell neue Exceptions bekommt, bevor er aus OK geklickt hat. Wie gesagt, einfach die Exceptions durch leeren except-Block schlucken will ich nicht, aber ausblenden will ich sie. Das bedeutet aber nicht, dass diese
Exception, falls sie ganz woanders auftritt, auch nicht angezeigt werden soll.
Stattdessen will ich nur in meinem Code aus den Exceptions (aus fremden Code oder aus der
VCL) in stille Exceptions umwandeln, sie aber noch abfangbar lassen.
Also, Eigenschaften kopieren ist eine Lösung, jedoch nicht allgemein genug, da eine
Exception-Klasse auch neue Eigenschaften einführen kann, und ich will nicht für jede eventuelle
Exception, die auftreten könnte, eine neue stille
Exception einführen, wenn es eine bessere Möglichkeit gibt.
Eventuell weiß ja jemand, wie man das freigeben einer
Exception-Klasse verhindern kann, dann köntne mein oben geschilderter Ansatz nämlich funktionieren. Wenn nicht, muss ich es, so wie es jetzt aussieht, wohl oder übel wie von
TP vorgeschlagen, per Eigenschaften kopieren machen.
Mfg
FAlter