Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [Quiz] welcher Exception Handler wird ausgeführt? (https://www.delphipraxis.net/184526-%5Bquiz%5D-welcher-exception-handler-wird-ausgefuehrt.html)

mjustin 1. Apr 2015 16:30

Delphi-Version: 2009

[Quiz] welcher Exception Handler wird ausgeführt?
 
Und schon wieder ein Quiz zum Thema Exceptions. Gegeben sei dieser Quelltext:

Delphi-Quellcode:
program FunWithDelphi;
 
{$APPTYPE CONSOLE}
 
uses
  Controls, SysUtils;
 
begin
  try
    raise TMouse.Create;
  except
    on E:Exception do
    begin
      Writeln(E.Classname, ': E is Exception');
    end;
    on E:TObject do
    begin
      Writeln(E.Classname, ': E is TObject');
    end;
    on E:TMouse do
    begin
      Writeln(E.Classname, ': E is TMouse');
    end;
  end;
  ReadLn;
end.
Was wird geschehen?
  • das Programm gibt “TMouse: E is Exception” aus
  • das Programm gibt “TMouse: E is TObject” aus
  • das Programm gibt “TMouse: E is TMouse” aus
  • der Compiler stoppt mit einer Fehlermeldung
  • das Programm endet mit einem Laufzeitfehler

Wer es es richtig errät, darf natürlich hier posten was geschieht (und warum). Wer es nicht errät, drückt F5 im Browser bis die Antwort erscheint :)

Neutral General 1. Apr 2015 16:44

AW: [Quiz] welcher Exception Handler wird ausgeführt?
 
Zitat:

das Programm gibt “TMouse: E is TObject” aus
Ist eigentlich logisch. TMouse ist nicht von Exception abgeleitet, von daher kann das nicht zutreffen und ansonsten zählt: Wer zuerst kommt, mahlt zuerst.
Ich wusste allerdings nicht dass man auch Nicht-Exception-Klassen raisen kann. Ich habe also ein bisschen geschummelt weil ichs ausprobiert habe :X

himitsu 1. Apr 2015 18:23

AW: [Quiz] welcher Exception Handler wird ausgeführt?
 
Stimmt.

Joar, kann man ... drum ist System.ExceptObject auch ein TObject und keine Exception. (naja, abgesehn von der lage deren Definition ... SysUtils :stupid:)
Wenn die Exception aus einer DLL kommt, dann ist es dort eine andere Exception-Klasse, wie im eigenen Modul ... im Grunde ist es da nichtmal mehr ein TObject, da ebenfalls unterschiedliche RTTI.

PS: Du hast das ELSE vergessen. :zwinker:

Der schöne Günther 1. Apr 2015 18:40

AW: [Quiz] welcher Exception Handler wird ausgeführt?
 
Ich bin hin und hergerissen zwischen dem "TMouse: E is TObject" und einem Laufzeitfehler. :?
Ich glaube schon eher letzteres...


// Jetzt doch einmal ausprobiert. Interessant am Rande ist dass die IDE nicht anhält. Bei der ... TMouse.

himitsu 1. Apr 2015 19:20

AW: [Quiz] welcher Exception Handler wird ausgeführt?
 
Eine Exception in der Exceptionbehandlung ist auch immer was Schönes ... da beendet Windows gleich den kompletten Prozess, da Diese direkt und ungebremst bis zum Windows durchrauscht. :thumb:

Delphi-Quellcode:
raise Exception(nil);

BUG 1. Apr 2015 19:48

AW: [Quiz] welcher Exception Handler wird ausgeführt?
 
Zitat:

Zitat von himitsu (Beitrag 1295875)
Eine Exception in der Exceptionbehandlung ist auch immer was Schönes ... da beendet Windows gleich den kompletten Prozess, da Diese direkt und ungebremst bis zum Windows durchrauscht. :thumb:

Ehrlich gesagt finde ich das legitim. Wenn an der Stelle Fehler auftreten, ist vermutlich eh alles verloren. Man könnte eventuell noch eine weitere Exception aus der Runtime-Bibliothek werfen, die garantiert fehlerfrei (:mrgreen:) ist. Wenn das auch noch fehlschlägt ... dann waren einem die Maschinengötter wohl nicht gnädig.

himitsu 1. Apr 2015 19:54

AW: [Quiz] welcher Exception Handler wird ausgeführt?
 
Ein Try-Except im Exception-Handling ... wir lieben doch unsere Endlosschleifen.

mjustin 2. Apr 2015 10:26

AW: [Quiz] welcher Exception Handler wird ausgeführt?
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1295864)
// Jetzt doch einmal ausprobiert. Interessant am Rande ist dass die IDE nicht anhält. Bei der ... TMouse.

Das hatte mich auch überrascht. Die Delphi Dokumentation benennt sogar eine Exceptionklasse in der VCL, die nicht von SysUtils.Exception abgeleitet ist: OutlineError. Die würde in einem except on Exception (...) nicht behandelt, sondern nur im else oder wenn man auch on TObject oder explizit mit on OutlineError.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:12 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