Die Zugriffsverletzung, die du beschreibst, kommt nicht vom ersten Fehler innerhalb des except-Blocks, sondern vom Freigeben des nicht erzeugten Objekts danach!
Erklärung:
Die Statements im finally-Block werden
immer ausgeführt, also auch dann, wenn dein create() fehlschlägt.
Somit knallt es dann auch dort nochmal, weil dein "o"-Objekt an der Stelle nicht erzeugt wurde, du es aber freigeben willst.
Also entweder so:
Delphi-Quellcode:
var
o : TObject;
begin
try
try
o := TObject.Create;
FreeAndNil(o);
except
ShowMessage('error');
end;
end;
oder so:
Delphi-Quellcode:
var
o : TObject;
begin
try
try
o := TObject.Create;
except
ShowMessage('error');
end;
finally
if assigned(o) then FreeAndNil(o);
end;
oder mit ausführlicher Fehlermeldung:
Delphi-Quellcode:
var
o : TObject;
begin
try
try
o := TObject.Create;
except
on E :
Exception do
ShowMessage('
Error ['+ E.ClassName+'
]: '+ E.
Message);
end;
finally
if assigned(o)
then FreeAndNil(o);
end;