Einzelnen Beitrag anzeigen

Rolf Frei

Registriert seit: 19. Jun 2006
629 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: EOutOfResources - Wie viele Handles sind noch verfügbar?

  Alt 19. Dez 2019, 17:03
Das try/finally ist eigentlich eines der wichtigsten Konstrukte und du solltest dir angewöhnene damit zu arbeiten. Deine Variante mit den vielen try/except würde zwar auch funktionieren, aber ist meiner Meinung nach viel zu kompliziert. Ausserdem ist es nicht unbedingt die fein Art da einfach alle Exception zu "schlucken". Wie weist du denn ausserhalb deiner Routine, ob alles sauber verabreitet wurde? Wertest du da nach jedem Aufruf das Log aus? Das kann ich mir nicht vorstellen. Ich mache für solche Situationen in der Regel auch eigene Exceptions und frage die dann extern ab, damit ich weiss was da genau passiert ist und wie ich auf die jeweilige Situation reagieren muss.

OK in deinem Beispiel mit dem Button1Click Event macht das keinen Sinn, da du das nicht selber aufrufst, aber in einer Funtkion die du an verschiedenen Stellen aufrufst, ist das eine dumme Idee einfach alle Exceptions zu verschlucken.

Hier nochmal ein kleines Beispiel, wenn das Bestandteil einer Funktion wäre. Ob du das except oder das finally zu oberst hast, hängt vom jeweiligen Code ab. Du bist da eigentlich frei wie du das machst. Der Auswertung erfolgt immer vom innersten Block nach aussen. Also hier wird zuerst das Except behandelt und erst danach das Finally. In deinem Beisiel ist es umgekehrt, weil da das Finally zu innerst ist.
Delphi-Quellcode:
type
  EMyNilException = class(Exception);

procedure DoSomething();
var
  tmp: TButton;
begin
  try
    try
      tmp := NIL;
      if tmp = nil then
        raise EMyNilException.Create('tmp ist NIL!');
      tmp.Click;
    except
      on E: EMyNilException do
      begin
        ShowMessage(e.Message);
        raise;
      end
      else
        raise; // Exception die wir nicht selber behandeln sollten erneut ausgelöst werden.
    end;

    ShowMessage('2');
  finally
    ShowMessage('finally');
  end;
end;

begin
  try
    DoSoemthing;
  except
    on E: EMyNilException do
      ShowMessage('Es ist eine NIL-Verletzung aufgetreten');
    else
      raise;
  end;
end

Geändert von Rolf Frei (19. Dez 2019 um 19:52 Uhr)
  Mit Zitat antworten Zitat