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?