![]() |
Delphi-Version: 5
Mögliche Exceptions eines Objektes herausfinden
Hallo,
vermutlich stehe ich mächtig auf dem Schlauch, ich weiß auch nicht wirklich wie ich danach suchen soll (obgleich ich es getan habe :freak:). Es geht um etwas sehr einfaches aber anscheinend auch mächtig schwieriges: Nehmen wir an ich rufe eine Methode auf:
Code:
Und nehmen wir weiter folgendes an:
try
myKompo.DoSomething; except [...] - die Klasse von myKompo hat ca. 40 Millionen Quellcodezeilen - die Methode DoSomething kann 17.000 verschiedene Exceptions werfen - es existiert eine eher dürftige Dokumentation der Komponente Wie (zur Hölle! ^^) finde ich raus, welche Exceptions möglich sind? Ich kann ja nicht 40 Millionen Quellcodezeilen manuell durchsuchen. Ich kann auch nicht 17.000 fehlerhafte Programmzustände manuell herstellen, um die Exceptions zu provozieren, von denen ich nicht mal weiß dass es sie gibt. lg Caps ps Um mein Problem in der Realität zu verankern, zitiere ich einfach mal die Onlinehilfe von Delphi: Zitat:
: : : |
AW: Mögliche Exceptions eines Objektes herausfinden
Zitat:
Man kann auch im Source nach
Delphi-Quellcode:
suchen.
raise
|
AW: Mögliche Exceptions eines Objektes herausfinden
Zitat:
Man kann auch via RTTI alles Exception-Klassen suchen, die im Programm einkompiliert wurden. (liefert nur die klassen, aber natürlich nicht wo sie ausgelöst werden) Gut dokumentierte Funktionen/Klassen würden in der Doku/Attributen/PasDocKommentaren ausgelistet haben, was plausible Rückgabewerte wären und dazu gehören auch die Namen der Exceptions. Im EXCEPT muß man auch nur die Klassen aufnehmen, die man anders behandeln will, da wird nicht einfach irgendwas/alles reingemacht. Und schon garnicht macht man da standardmäßig blinden Code rein, der Exceptions wahllos still und heimlich abfängt. (der also "garnichts" macht) |
AW: Mögliche Exceptions eines Objektes herausfinden
Möchtest Du tatsächlich Code für die diversen (17000) verschiedenen Exceptiontypen schreiben? Also 17000 unterschiedliche Reaktionen auf 17000 unterschiedliche Ausnahmen (verdammt viele Ausnahmen, übrigens...bei mir gälte zu diesem Zeitpunkt dann der "Normalzustand" als Ausnahme, aber sei's drum).
Bei mir gilt jede Exception als Dealbreaker, die Exception wird geloggt und der betreffende Vorgang muss erneut gestartet werden. Wenn es bei dem Problem bleibt, beendet sich das Programm. Sherlock |
AW: Mögliche Exceptions eines Objektes herausfinden
Zitat:
lg Caps |
AW: Mögliche Exceptions eines Objektes herausfinden
Hi, sowas dachte ich mir schon :?
Zitat "Man kann auch im Source nach raise suchen." Deswegen die beispielhaften 40 Mio Zeilen. Ich möchte eben nicht danach suchen müssen. Zitat "Gut dokumentierte Funktionen/Klassen [..]" Deswegen die Anmerkung, dass die Klasse dürftig dokumentier ist. Das ist sie leider. Danke trotzdem, mal sehen, wie ich rangehe. Oder ich lasse die Kiste einfach beim Kunden hochgehen ^^… lg Caps |
AW: Mögliche Exceptions eines Objektes herausfinden
Zitat:
Indy und die meisten DB-Connections sollten ein passendes Event oder Optionen haben, wo man sagen kann, wie ereagiert werden soll. > AbbruchMitException (Standard), AbbruchOnException (tu so als sei nix), VersuchsSofortNochmal, WarteBisslUndVersuchsNochmal (x Wiederholungen und dann Erstes) oder man ändert im Event etwas und versucht es dann nochmal (z.B. Umschalten auf einen alternativen Port/Host) Bei uns hier ist nahezu jede im Programm verwendete Komponente erstmal abgeleitet. So kann man Bugfixes, Erweiterungen und Änderungen am Verhalten problemlos zentral anpassen, ohne zigtausend Formulare überarbeiten zu müssen. |
AW: Mögliche Exceptions eines Objektes herausfinden
Bei meinem Delphi gibt es im BIN-Verzeichnis 'ne Grep.exe. Wenn ich die so aufrufe
Code:
gräbt die sich durch alle .pas-Dateien in dem Verzeichnis und raus kommt eine Datei in der alle Dateiname, die Zeilennummer und die Zeile stehen, in der die Zeichenfolge Except zu finden ist.
c:\Delphi7\Bin>grep -dni except "e:\delphi\*.pas > grep.except.log"
Das kann für eine Datei dann z. B. so aussehen:
Code:
oder
File e:\delphi\PNG\pngimage.pas:
250 {Custom exception handler} 251 Exception = class(TObject) 254 ExceptClass = class of Exception; 259 EPNGOutMemory = class(Exception); 260 EPngError = class(Exception); 261 EPngUnexpectedEnd = class(Exception); 262 EPngInvalidCRC = class(Exception); 263 EPngInvalidIHDR = class(Exception); 264 EPNGMissingMultipleIDAT = class(Exception); 265 EPNGZLIBError = class(Exception); 266 EPNGInvalidPalette = class(Exception); 267 EPNGInvalidFileHeader = class(Exception); 268 EPNGIHDRNotFirst = class(Exception); 269 EPNGNotExists = class(Exception); 270 EPNGSizeExceeds = class(Exception); 271 EPNGMissingPalette = class(Exception); 272 EPNGUnknownCriticalChunk = class(Exception); 273 EPNGUnknownCompression = class(Exception); 274 EPNGUnknownInterlace = class(Exception); 275 EPNGNoImageData = class(Exception); 276 EPNGCouldNotLoadResource = class(Exception); 277 EPNGCannotChangeTransparent = class(Exception); 278 EPNGHeaderNotPresent = class(Exception); 279 EPNGInvalidNewSize = class(Exception); 280 EPNGInvalidSpec = class(Exception); 539 procedure RaiseError(ExceptionClass: ExceptClass; Text: String); 1163 {Exception implementation} 1164 constructor Exception.Create(Msg: String); 4565 procedure TPngObject.RaiseError(ExceptionClass: ExceptClass; Text: String); 4567 raise ExceptionClass.Create(Text); 5030 except 5143 except RaiseError(EPNGCouldNotLoadResource, EPNGCouldNotLoadResourceText); 5180 else raise Exception.Create(''); 5182 else raise Exception.Create('');
Code:
ergibt
c:\Delphi7\Bin>grep -dni class\(exception\) "e:\delphi\*.pas" >grep.class_Exception.log
Code:
Und für den Sack Raise aus China ;-)
File e:\delphi\PNG\pngimage.pas:
259 EPNGOutMemory = class(Exception); 260 EPngError = class(Exception); 261 EPngUnexpectedEnd = class(Exception); 262 EPngInvalidCRC = class(Exception); 263 EPngInvalidIHDR = class(Exception); 264 EPNGMissingMultipleIDAT = class(Exception); 265 EPNGZLIBError = class(Exception); 266 EPNGInvalidPalette = class(Exception); 267 EPNGInvalidFileHeader = class(Exception); 268 EPNGIHDRNotFirst = class(Exception); 269 EPNGNotExists = class(Exception); 270 EPNGSizeExceeds = class(Exception); 271 EPNGMissingPalette = class(Exception); 272 EPNGUnknownCriticalChunk = class(Exception); 273 EPNGUnknownCompression = class(Exception); 274 EPNGUnknownInterlace = class(Exception); 275 EPNGNoImageData = class(Exception); 276 EPNGCouldNotLoadResource = class(Exception); 277 EPNGCannotChangeTransparent = class(Exception); 278 EPNGHeaderNotPresent = class(Exception); 279 EPNGInvalidNewSize = class(Exception); 280 EPNGInvalidSpec = class(Exception);
Code:
bekommen wir sowas:
c:\Delphi7\Bin>grep -dni raise "e:\delphi\*.pas" >grep.raise.log
Code:
Sollte für den Anfang und einen ersten Überblick sicherlich erstmal reichen ;-)
File e:\delphi\PNG\pngimage.pas:
539 procedure RaiseError(ExceptionClass: ExceptClass; Text: String); 1625 fOwner.RaiseError(EPngError, EPNGCannotAddChunkText) 1630 fOwner.RaiseError(EPngError, EPNGCannotAddChunkText) 1634 fOwner.RaiseError(EPngError, EPNGCannotAddInvalidImageText) 1826 if ResID = 0 then raise EPNGError.Create(''); 2014 Owner.RaiseError(EPngInvalidCRC, EPngInvalidCRCText); 2242 Owner.RaiseError(EPNGError, EPNGCannotAssignChunkText); 2276 Owner.RaiseError(EPNGInvalidIHDR, EPNGInvalidIHDRText); 2289 Owner.RaiseError(EPNGSizeExceeds, EPNGSizeExceedsText); 2296 Owner.RaiseError(EPNGUnknownCompression, EPNGUnknownCompressionText); 2303 Owner.RaiseError(EPNGUnknownInterlace, EPNGUnknownInterlaceText); 2593 if Size > 256 then Owner.RaiseError(EPNGInvalidPalette, 2680 Owner.RaiseError(EPNGInvalidCRC, EPNGInvalidCRCText); 2692 Owner.RaiseError(EPNGMissingMultipleIDAT, EPNGMissingMultipleIDATText); 2736 Owner.RaiseError(EPNGZLIBError, 3501 Owner.RaiseError(EPngInvalidCRC, EPngInvalidCRCText); 4230 {Test if item is valid, if not raise error} 4232 Owner.RaiseError(EPNGError, EPNGUnknownPalEntryText) 4258 {Raise error} 4260 Owner.RaiseError(EPNGInvalidPalette, EPNGInvalidPaletteText); 4321 Owner.RaiseError(EPNGError, EPNGCannotAssignChunkText); 4333 Owner.RaiseError(EPNGError, EPNGCannotAssignChunkText); 4446 RaiseError(EPNGInvalidSpec, EInvalidSpec); 4564 {Raises an error} 4565 procedure TPngObject.RaiseError(ExceptionClass: ExceptClass; Text: String); 4567 raise ExceptionClass.Create(Text); 4621 {In case it does not exists, raise error} 4622 RaiseError(EPNGNotExists, EPNGNotExistsText); 4671 RaiseError(EPNGHeaderNotPresent, EPNGHeaderNotPresentText); 4766 if (BufferDC = 0) then RaiseError(EPNGOutMemory, EPNGOutMemoryText); 4774 RaiseError(EPNGOutMemory, EPNGOutMemoryText); 4966 RaiseError(EPNGInvalidFileHeader, EPNGInvalidFileHeaderText); 4988 RaiseError(EPNGUnexpectedEnd, EPNGUnexpectedEndText); 5000 RaiseError(EPNGIHDRNotFirst, EPNGIHDRNotFirstText); 5023 RaiseError(EPNGUnknownCriticalChunk, EPNGUnknownCriticalChunkText); 5032 raise; 5043 RaiseError(EPNGNoImageData, EPNGNoImageDataText); 5143 except RaiseError(EPNGCouldNotLoadResource, EPNGCouldNotLoadResourceText); 5180 else raise Exception.Create(''); 5182 else raise Exception.Create(''); 5483 COLOR_RGBALPHA, COLOR_GRAYSCALEALPHA: Self.RaiseError( 5696 RaiseError(EPNGInvalidNewSize, EInvalidNewSize) Ok: Bei den von Dir genannten Mengen an Zeilen und Exceptions wird es wohl erstmal sehr viel als Ergebnis geben, aber sicherlich besser als alles manuell durchsehen zu müssen. Wird das zu Suchende in mehreren Dateien gefunden, so enthält die Ausgabe halt mehrere derartige Blöcke in der Reihenfolge des Findens der Dateien. Hilfe zum Grep: ![]() |
AW: Mögliche Exceptions eines Objektes herausfinden
Zitat:
Wenn man schon nach "raise" (ganzes Wort) sucht, dann sollte man RaiseOuterException nicht vergessen. Nach "raise" als Teilwort zu suchen kann massig Anderes Zeugs liefern, wobei RaiseError hier wieder ein Sonderfall ist. (man findet darin das "raise" und darf dann auch noch nach der Funktion suchen) |
AW: Mögliche Exceptions eines Objektes herausfinden
Man, das soll doch keine fertige Lösung sein, sondern nur ein Hinweis darauf, dass bei Delphi ein Grep dabei ist, mal drei Lösungsansätze für Teilmengen dabei und dann bitte gefälligst selbst nach der für den (nicht näher beschriebenen) Einzelfall suchen.
Grep kann reguläre Ausdrücke. Jetzt bist Du dran, weist ja zuweilen darauf hin, dass man damit viel machen kann. Sei so gut und liefere den passenden regulären Ausdruck, der alles, was Du jetzt meinst mit abfrühstücken zu müssen, liefert. ff ;-) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz