SITUATIONDelphi raise Ausnahme in Konstruktor
Ich werde eine Klasse schreiben und der Konstruktor ist ein Brauch, die ich gemacht habe, weil ich einige Werte initialisieren müssen. Dies ist der Code, den ich bisher geschrieben habe:
type
TCombinatorio = class(TObject)
private
valN, valK: integer;
result: double;
public
property K: integer read valK;
property N: integer read valN;
constructor Create(valN: integer; valK: integer);
end;
constructor TCombinatorio.Create(valN: Integer; valK: Integer);
begin
inherited Create;
Self.valN := valN;
Self.valK := valK;
if ((valN < 0) or (valK < 0)) then
begin
raise Exception.Create('N and K must be >= 0');
end;
end;
Da ich einige mathematische Berechnungen werde tun, ich brauche negative Zahlen zu vermeiden.
FRAGE
Kann ich eine Ausnahme im Konstruktor auf diese Weise nennen? Ich verwende den Code auf diese Weise:
procedure TForm1.Button1Click(Sender: TObject);
var a: TCombinatorio;
b: string;
begin
a := TCombinatorio.Create(5,-2);
try
//some code
finally
a.Free;
end;
end;
Wie Sie hier sehen, ich habe falsche Parameter für meinen Konstruktor, da die zweiten negativ ist. Ich kann auch nicht verstehen (nach dem Code meines Konstruktors), wenn die a.Free
innerhalb der endlich wirklich benötigt wird, denn wenn der Konstruktor die Ausnahme auslöst, wird der Destruktor aufgerufen.
Ich dachte, die a := TCombinatorio.Create(5,-2);
in den try-finally Block zu integrieren, um das Problem zu vermeiden, aber ich bin mir nicht sicher. Was denken Sie?
Nun, da ich vorsichtig gerade lese, denke ich, dass ich ein gemachter dumme Überlegung. Im Falle einer Ausnahme, die im Konstruktor ausgelöst wird, wird try-finally nicht ausgeführt, weil ich vorher stoppe. Also muss ich mir keine Sorgen machen und ich werde die Kreation nicht in den Block aufnehmen. Sehr hilfreich;) –
Das Erstellen von Ausnahmen in Konstruktoren in Delphi ist Antipattern und sollte normalerweise nie verwendet werden. – kludg
@kludg - Wenn Sie zur Konstruktionszeit wissen, dass eine Instanz unbrauchbar sein wird, ist der Konstruktor der beste Ort, um ein Exception-Imo auszulösen. Die Alternative besteht darin, eine Ausnahme auszulösen, wenn die Instanz verwendet wird, was zu interessanten Debugging-Sitzungen führen könnte, um zu wissen, woher der Fehler stammt. Das heißt, in diesem speziellen Fall sollte OP zu vorzeichenlosen Ganzzahlen wechseln. –