AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Mögliche Exceptions eines Objektes herausfinden
Thema durchsuchen
Ansicht
Themen-Optionen

Mögliche Exceptions eines Objektes herausfinden

Ein Thema von Caps · begonnen am 17. Apr 2020 · letzter Beitrag vom 20. Apr 2020
Antwort Antwort
Seite 1 von 2  1 2      
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#1

Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 10:52
Delphi-Version: 5
Hallo,

vermutlich stehe ich mächtig auf dem Schlauch, ich weiß auch nicht wirklich wie ich danach suchen soll (obgleich ich es getan habe ).
Es geht um etwas sehr einfaches aber anscheinend auch mächtig schwieriges:

Nehmen wir an ich rufe eine Methode auf:

Code:
try
  myKompo.DoSomething;
except [...]
Und nehmen wir weiter folgendes an:
- 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:
Code:
try
    ...
except
     on EZeroDivide do HandleZeroDivide;
     on EOverflow do HandleOverflow;
     on EMathError do HandleMathError;
else
     HandleAllOthers;
end;
Tja, wenn ich nur wüsste, dass es EZeroDivide, EOverflow und EMathError überhaupt gibt...(!)
:
:
:
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#2

AW: Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 10:58
- die Methode DoSomething kann 17.000 verschiedene Exceptions werfen
Diese 17.000 verschiedenen Exceptions müssen ja irgendwo deklariert sein damit sie geworfen werden können. Das wäre doch schon mal der erste Ansatz.

Man kann auch im Source nach raise suchen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#3

AW: Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 11:21
Zitat:
Ich kann auch nicht 17.000 fehlerhafte Programmzustände manuell herstellen, um die Exceptions zu provozieren
Stichwort: Unit-Testing

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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.798 Beiträge
 
Delphi 12 Athens
 
#4

AW: Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 11:30
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
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#5

AW: Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 11:34
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
Naja, angenommen eine nicht vorhandene Netzwerkverbindung löst beim Connect eine Exception aus. Dann probiere ich halt solange, bis die Verbindung wieder da ist, so wie das jede Chat-App macht. Das wäre für mich kein Dealbreaker. Und ein "Connection-Closed-Gracefully" (Indy) ist ja auch so ne Sache wo eigentlich nix los... ^^

lg Caps
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."

Geändert von Caps (17. Apr 2020 um 11:36 Uhr)
  Mit Zitat antworten Zitat
Caps

Registriert seit: 23. Mär 2006
Ort: Leipzig
299 Beiträge
 
#6

AW: Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 11:36
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
"Der Mode cmCFS8 ist prohibitär und von mir entwickelt."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#7

AW: Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 11:57
Zitat:
angenommen eine nicht vorhandene Netzwerkverbindung löst beim Connect eine Exception aus. Dann probiere ich halt solange, bis die Verbindung wieder da ist
Sowas kann man aber auch in der/den Connections erledigen.
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Apr 2020 um 11:59 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#8

AW: Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 14:43
Bei meinem Delphi gibt es im BIN-Verzeichnis 'ne Grep.exe. Wenn ich die so aufrufe
Code:
c:\Delphi7\Bin>grep -dni except "e:\delphi\*.pas > grep.except.log"
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.

Das kann für eine Datei dann z. B. so aussehen:
Code:
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('');
oder
Code:
c:\Delphi7\Bin>grep -dni class\(exception\) "e:\delphi\*.pas" >grep.class_Exception.log
ergibt
Code:
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);
Und für den Sack Raise aus China
Code:
c:\Delphi7\Bin>grep -dni raise "e:\delphi\*.pas" >grep.raise.log
bekommen wir sowas:
Code:
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)
Sollte für den Anfang und einen ersten Überblick sicherlich erstmal reichen

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: http://docwiki.embarcadero.com/RADSt...search_utility
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.033 Beiträge
 
Delphi 12 Athens
 
#9

AW: Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 16:34
Zitat von grep except:
259 EPNGOutMemory = class(Exception);
260 EPngError = class(Exception);
261 EPngUnexpectedEnd = class(Exception);
262 EPngInvalidCRC = class(Exception);
263 EPngInvalidIHDR = class(Exception);
...
Und was ist mit vererrbten Exceptions, die nicht direkt von Exception abgeleitet wurden?

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)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (17. Apr 2020 um 16:38 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#10

AW: Mögliche Exceptions eines Objektes herausfinden

  Alt 17. Apr 2020, 16:42
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

Geändert von Delphi.Narium (17. Apr 2020 um 17:04 Uhr) Grund: Text ergänzt
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz