Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

for..in erlaubt kein "raise" im Exception-Handler, for..to hingegen schon

  Alt 4. Jul 2018, 10:58
Delphi-Version: 5
Ist hier wieder dunkle Compiler-Magic am Werk? Konstruierter Fall: Ich habe den Fall dass eine Methode entweder eine EProgrammerNotFound wirft oder eine EAggregateException mit einem Sack an Exceptions da drin.

Wenn ich nur EProgrammerNotFound-Exceptions bekomme ist alles in Butter und kann die behandeln. Ist noch etwas anderes dabei möchte ich die Exception weiter nach oben geben.

Es sieht so aus:

uses System.SysUtils, System.Threading
Delphi-Quellcode:
procedure p();
var
   ex: Exception;
begin
   try
      // do something amazing
   except
      on EProgrammerNotFound do
         findNewProgrammer();
      on e: EAggregateException do
         begin
            for ex in e do
               if (not (ex is EProgrammerNotFound)) then
                  raise; // E2145
            findNewProgrammer();
         end;
   else
      raise;
   end;
end;
Das klappt nur in der Theorie, denn der Compiler streicht das raise an und meint:

E2145 Wiederhervorrufen einer Exception ist nur im Exception-Handler möglich

Schreibe ich es hingegen um dass statt einem for..in ein klassisches for..x..to..y zum Einsatz kommt hat niemand etwas dagegen:

Delphi-Quellcode:
procedure p();
var
   ex: Exception;
   exIndex: NativeInt;
begin
   try
      // do something amazing
   except
      on EProgrammerNotFound do
         findNewProgrammer();
      on e: EAggregateException do
         begin
            for exIndex := 0 to Pred(e.Count) do
               if (not (e.InnerExceptions[exIndex] is EProgrammerNotFound)) then
                  raise;
            findNewProgrammer();
         end;
   else
      raise;
   end;
end;

Warum ist das so?
  Mit Zitat antworten Zitat