W1035添加一个try-finally块后,可能无法预定义函数'Test'的返回值

问题描述

我在编译时遇到了意外的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

  1. 如果CheckFn引发异常,则立即转到finally子句,然后不返回值就离开该函数。
  2. 否则,如果CheckFn返回True,则将从函数返回True
  3. 否则,如果CheckFn返回False,则将引发异常并立即转到finally子句,然后不返回值就退出该函数。

因此,在所有情况下此函数确实返回值时,都将对其进行定义(特别是True)。因此,编译器发出此警告是错误的。

而且,实际上,在Delphi 10.4中,此代码不会产生警告。

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