Dankesehr für die Antworten und die Mühe.
Ich habe das Beispeil von Günther noch etwas erweitert, um mal genau zu sehen was eigentlich passiert,
siehe Anhang.
Ihr habt natürlich Recht (und der Compiler-Hint auch), ein bischen Nachdenken hilft immer
Delphi-Quellcode:
procedure p();
begin
raise EProgrammerNotFound.Create('
nope');
end;
function TForm1.fCrashable(bShallCrash : Boolean): Integer;
begin
Result := 88;
//H2077 Auf 'f' zugewiesener Wert wird niemals benutzt
Memo1.Lines.Add( '
- In fCrashable.Vorgabe: Result = ' + Result.ToString );
try
if bShallCrash
then
begin
p();
end;
Result := 42-1;
Memo1.Lines.Add( '
- In fCrashable.Zwischenwert: Result = ' + Result.ToString );
finally
// nothing
Inc(Result);
Memo1.Lines.Add( '
- In fCrashable.finally: Result = ' + Result.ToString );
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
iRes: Integer;
begin
try
iRes := 1000;
Memo1.Lines.Clear;
Memo1.Lines.Add( '
Ohne Crash' );
iRes := 77;
// diese Vorgabe ist überflüssig wenns nicht crasht
Memo1.Lines.Add( '
- Variable vordefiniert auf 77' );
Memo1.Lines.Add( '
- Aufruf fCrashable( False )' );
iRes := fCrashable(False);
Memo1.Lines.Add( '
- Ergebnis: Result = ' + iRes.ToString );
except
Memo1.Lines.Add( '
- Exception: Result = ' + iRes.ToString );
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
iRes: Integer;
begin
try
Memo1.Lines.Clear;
Memo1.Lines.Add( '
Mit Crash' );
iRes := 77;
// diese Vorgabe wird übernommen, im Fall eines Crashes
Memo1.Lines.Add( '
- Variable vordefiniert auf 77' );
Memo1.Lines.Add( '
- Aufruf fCrashable( False )' );
iRes := fCrashable(True);
// Diese Zuweisung wird NICHT ausgeführt bei Crash
Memo1.Lines.Add( '
- Ergebnis: Result = ' + iRes.ToString );
except
Memo1.Lines.Add( '
- Exception: Result = ' + iRes.ToString );
end;
end;
Das Ergebnis sieht dann so aus:
Viellleicht hilft es ja dem nächsten auch wieder auf die Sprünge.
Ich muss mich jedenfalls wohl mal wieder um ein paar alte Leichen bei mir kümmern.
Rollo