问题描述
我在编译时遇到了意外的W1035:
[dcc32警告] Unit1.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;
为什么会这样? (臭虫?)
解决方法
让我们来分析Test
。
- 如果
CheckFn
引发异常,则立即转到finally
子句,然后不返回值就离开该函数。 - 否则,如果
CheckFn
返回True
,则将从函数返回True
。 - 否则,如果
CheckFn
返回False
,则将引发异常并立即转到finally
子句,然后不返回值就退出该函数。
因此,在所有情况下此函数确实返回值时,都将对其进行定义(特别是True
)。因此,编译器发出此警告是错误的。
而且,实际上,在Delphi 10.4中,此代码不会产生警告。
(或者,您是否可能将finally
与except
混淆了?如果这样,则编译器是正确的。)