我在编译时遇到了一个意外的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
。
- 如果
CheckFn
引发异常,则立即转到finally
子句,然后离开函数而不返回值 - 否则,如果
CheckFn
返回True
,您将从函数返回True
- 否则,如果
CheckFn
返回False
,则将引发异常并立即转到finally
子句,然后在不返回值的情况下离开函数
因此,在所有情况下,当此函数返回值时,都会定义它(具体地说,它是True
(。因此,编译器发出此警告是错误的。
事实上,在Delphi10.4中,并没有为该代码生成任何警告。
(或者,只是有可能,你把finally
和except
混淆了吗?如果是,编译器是对的。(