编译器警告“返回值可能未定义”

时间:2011-07-04 10:29:14

标签: delphi compiler-warnings delphi-xe

我经常使用以下代码:

function GetNumber(Handle : THandle) : Integer;
begin
FLock.BeginRead;
try
  if FMap.TryGetValue(Handle, Object) then
    raise EArgumentException.Create('Invalid handle');
  Result := Object.Number;
finally
  FLock.EndRead;
end;
end;

不幸的是,编译器向我发出了所有这些方法的警告:

[DCC Warning] Unit.pas(1012): W1035 Return value of function 'GetNumber' might be undefined

我知道这个警告,但在这种情况下我完全看不出任何理由。或者是否存在我遗漏的情况会导致未定义的结果值?我理解try..except的情况下的警告,但对于try..finally,我对此没有任何意义。

问题:

  • 是否有任何理由要发出警告?
  • 如何摆脱它(将Result := Object.Number行移出锁定不是一种选择,我想避免在每个函数的顶部写一个完全不必要的Result := 0行)

谢谢!

3 个答案:

答案 0 :(得分:5)

  

警告有什么理由吗?

由于raise

,我看不到它,但它存在
  

如何摆脱它(将Result:= Object.Name行移出   锁不是一个选项,我想要   避免写完全   unncessary结果:= 0行在顶部   每个功能)

将raise语句移动到它自己的过程。

function GetNumber(Handle : THandle) : Integer;
    procedure InvHandle;
    begin
        raise EArgumentException.Create('Invalid handle');
    end;
begin
    FLock.BeginRead;
    try
        if FMap.TryGetValue(Handle, Object) then
            InvHandle;
        Result := Object.Number;
    finally
        FLock.EndRead;
    end;
end;

答案 1 :(得分:3)

这是一个编译器错误。如果删除了try/finally,则不会发出警告。编译器长期以来一直认识到raise使得编码者有义务分配返回值。无论出于何种原因,try/finally似乎都会混淆其分析。


第二个想法也许这不是编译器错误。如果finally块中的代码阻止异常传播怎么办?显然,没有except处理程序,但我更怀疑SystemSysUtils单位中的一个异常支持例程可能能够阻止异常进一步发展。

答案 2 :(得分:-2)

作业

Result := ...;
<{1}}块中的

缺失。