AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Exception in Basis-Klasse abfangen?

Ein Thema von mjenke · begonnen am 13. Feb 2008 · letzter Beitrag vom 13. Feb 2008
Antwort Antwort
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#1

Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 06:51
Guten Morgen, alle miteinander!

Folgendes Problem stellt sich mir:

Nehmen wir an, ich habe eine Basis-Klasse und n Klassen, die ich von ihr ableite. Gibt es eine Möglichkeit, ein Exception-Handling in der Basis-Klasse zu implementieren, das Exceptions aus den abgeleiteten Klassen abfängt?

Ein Beispiel:

TBase ist meine Basis-Klasse
TSub ist abgeleitet von TBase (TSub = class (TBase)).

Wenn ich nun in einer Methode von TSub in eine Exception gerate, möchte ich dass eine entsprechende Routine in TBase darauf reagiert. Und zwar so, dass ich nicht unbedingt in TSub im Exception-Fall die Methode aus TBase aufrufe. TBase soll sozusagen als Listener selbst darauf achten, dass in den von ihr abgeleiteten Klassen alles mit rechten Dingen zugeht...


Hintergrund ist einfach der, dass ich verschiedenste Klassen von meiner Basis ableiten muss (für Datenbankzugriffe unterschiedlichster Art), die aber alle in die gleichen Probleme geraten können. Und ich möchte nicht überall von Hand eingreifen müssen, sondern dieses Problem (wenn möglich) einmal in der Basis lösen.

Matthias Jenke
  Mit Zitat antworten Zitat
jottkaerr

Registriert seit: 2. Jul 2007
Ort: Tuttlingen
81 Beiträge
 
Delphi 10.1 Berlin Professional
 
#2

Re: Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 07:09
Hallo,

mach das ganze mit dem Template-Muster:

Delphi-Quellcode:
type
  TBase = class(TObject)
  protected
    procedure DoThis; virtual;
    procedure DoThat; virtual;
  public
    procedure Work;
  end;

  TDerived = class(TBase)
  protected
    procedure DoThis; override;
    procedure DoThat; override;
  end;

{ TBase }

procedure TBase.DoThis;
begin
  { ... }
end;

procedure TBase.DoThat;
begin
  { ... }
end;

procedure TBase.Work;
begin
  try
    DoThis;
    DoThat;
  except
    on e: Exception do
      { Exceptions behandeln }
  end;
end;

{ TDerived }

procedure TDerived.DoThis;
begin
  { ... }
  if Error then
    raise Exception.Create('Fehle in TDerivedDoThis!');
  { ... }
end;

procedure TDerived.DoThat;
begin
  { ... }
  if Error then
    raise Exception.Create('Fehle in TDerivedDoThat!');
  { ... }
end;
jkr
Jürgen Krämer
Sometimes I think the surest sign that intelligent life exists elsewhere
in the universe is that none of it has tried to contact us. (Calvin)
  Mit Zitat antworten Zitat
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#3

Re: Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 07:30
Hallo, jottkaerr,

vielen Dank für den Tipp, aber der hilft mir leider nicht weiter.

Es gibt nicht eine (oder auch nur eine geringe Anzahl von) Methode(n), die ich in den abgeleiteten Klassen aufrufen muss (in Deinem Beispiel die Methode "Work"). Die Methoden selbst sehen teilweise sehr unterschiedlich aus, haben die unterschiedlichsten Parameter etc.

In dem Fall wäre es tatsächlich einfacher, folgendermaßen vorzugehen:

Delphi-Quellcode:
TBase = class
  protected
    procedure RepairMe;
end;

TDerived = class ( TBase )
  public
    procedure DoSomething;
end;

TDerived2 = class ( TBase )
  public
    procedure DoSomethingCompletelyDifferent;
end;

{...}

{TBase}

procedure TBase.RepairMe;
begin
  {...}
end;

{TDerived}

procedure TDerived.DoSomething;
begin
  try
    ...
  except
    RepairMe;
  end;
end;

{TDerived2}

procedure TDerived2.DoSomethingCompletelyDifferent;
begin
  try
    ...
  except
    RepairMe;
  end;
end;
Aber das ist ja genau der Punkt, den ich gerne vermieden hätte...
Matthias Jenke
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 09:14
Das geht so einfach nicht.

Man könnte jetzt versuchen zu tricksen. Du könntest im Constrcuter von TBase die virtuelle und/oder die dynamische Methodentabelle umschreiben. Falls das reproduzierbar funktioniert, würden dann eben diese Methoden in allen abgeleiteten Klassen auf eine Methode in TBase umgeleitet werden. (Wenn überhaupt müssten die Methoden dann wahrscheinlich published sein)


Edit: Ordograffie gorrigiert

Edit2: Nach weiterem Nachdenken: geht so nicht
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
bluesbear

Registriert seit: 14. Dez 2005
Ort: Hahnstätten
355 Beiträge
 
Delphi 2007 Enterprise
 
#5

Re: Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 09:52
Hallo mjenke,
das ist zwar keine Antwort auf Deine Frage, aber vielleicht hilft es Dir ja weiter:
http://www.madshi.net/madExceptDescription.htm
Klaus M. Hoffmann
  Mit Zitat antworten Zitat
mjenke

Registriert seit: 28. Mär 2003
Ort: Bonn
131 Beiträge
 
#6

Re: Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 11:18
@bluesbear:

Hilft mir wirklich im Moment nicht. Aber trotzdem eine sehr interessante Geschichte. Vielen Dank für den Link!
Matthias Jenke
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 13:49
Wie unterschiedlich können denn die Deklarationen der Methoden (i.bes. die Anzahl und Art der Parameter) sein?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 14:23
Das von jottkaerr beschriebene Template-Muster ist trotzdem die richtige Lösung !!
Für jede Methode gibt es in der Basisklasse einen offiziellen Einstieg und eine virtuelle protected Methode.

Beispiel:

Delphi-Quellcode:
TBase = class(TObject)
  protected
    procedure InternalSaveToFile(const filename:string); virtual; abstract;

  public
    procedure SaveToFile(const filename:string); // die offizielle Methode
end;


procedure TBase.SaveToFile(const filename:string);
begin
  try
    InternalSaveToFile(filename);
  except
    on E:Exception do
    begin
      E.Message:='Fehler beim speichern in Datei <'+filename+'<';
      raise;
    end;
end;
Wenn man sich den Sourcecode von DB.pas und die Basisklasse TDataset anschaut, sieht man, dass Borland
auch das Template-Muster verwendet.
Für jede der wichtigen Methoden Open, close; Edit, Insert, Post,... existiert eine InternalXXXXX Methode.
Andreas
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 17:28
Andere Möglichkeit: Allen Methoden die Aufrufkonvention Safecall verpassen und in der Basisklasse SafeCallException überschreiben.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Exception in Basis-Klasse abfangen?

  Alt 13. Feb 2008, 18:32
Zitat von Apollonius:
Andere Möglichkeit: Allen Methoden die Aufrufkonvention Safecall verpassen und in der Basisklasse SafeCallException überschreiben.
Das funktioniert leider nur bei Delphi-eigenen Exceptions. Aber vielleicht reicht das aus.
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:37 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