W1035 添加 try-finally 块后意外出现可能未定义的函数'Test'的返回值



我在编译时遇到了一个意外的W1035

[dcc32警告]第一单元.pas(40(:W1035函数"测试"的返回值可能是未定义的

function CheckFn() : Boolean;
begin
Result := True;
end;
function Test() : Boolean;
begin
try
if(not CheckFn()) then
raise Exception.Create('Error Message');
Result := True;
finally
end;
end;

如果我删除try-finally块,则警告将消失。

function Test() : Boolean;
begin
if(not CheckFn()) then
raise Exception.Create('Error Message');
Result := True;
end;

为什么会发生这种情况?(Bug?(

让我们分析Test

  1. 如果CheckFn引发异常,则立即转到finally子句,然后离开函数而不返回值
  2. 否则,如果CheckFn返回True,您将从函数返回True
  3. 否则,如果CheckFn返回False,则将引发异常并立即转到finally子句,然后在不返回值的情况下离开函数

因此,在所有情况下,当此函数返回值时,都会定义它(具体地说,它是True(。因此,编译器发出此警告是错误的。

事实上,在Delphi10.4中,并没有为该代码生成任何警告。

(或者,只是有可能,你把finallyexcept混淆了吗?如果是,编译器是对的。(

最新更新