W1035 Return value of function 'Test' might be undefined 在添加 try-finally 块后意外出现

W1035 Return value of function 'Test' might be undefined unexpectedly appears after adding a try-finally block

我在编译时遇到意外的 W1035:

[dcc32 Warning] Unit1.pas(40): W1035 Return value of function 'Test' might be undefined

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

  1. 如果 CheckFn 引发异常,您会立即转到 finally 子句,然后离开该函数而不 return 输入值。
  2. 否则,如果CheckFn returns True,你将从函数中return True
  3. 否则,如果 CheckFn returns False,您将引发异常并立即转到 finally 子句,然后离开没有 return输入一个值。

因此,在所有情况下,当此函数执行 return 一个值时,它是已定义的(具体来说,它是 True)。因此,编译器发出此警告是错误的。

而且,事实上,在 Delphi 10.4 中,没有针对此代码生成警告。

(或者,您是否将 finallyexcept 混淆了?如果是这样,编译器是正确的。)