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

jpf*_*ius 12 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;
Run Code Online (Sandbox Code Playgroud)

不幸的是编译器给了我所有这些方法的警告:

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

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

问题:

  • 警告有什么理由吗?
  • 我怎样才能摆脱它(将Result := Object.Number线移出锁定不是一个选项,我想避免Result := 0在每个函数的顶部写一个完全不必要的行)

谢谢!

Mik*_*son 5

警告有什么理由吗?

我看不到一个,但因为它的存在 raise

我怎样才能摆脱它(将Result:= Object.Name行移出锁定不是一个选项,我想避免在每个函数的顶部写一个完全不需要的结果:= 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;
Run Code Online (Sandbox Code Playgroud)

  • @Mickael我不是建议解决方案是删除`try/finally` !!! 我要说的是,这显然是一个编译器错误. (5认同)
  • @craig你没看过上面的评论吗? (5认同)
  • 加薪并不是真正的问题.编译器早就认识到带有提升的代码路径会使编码人员有义务分配给返回值.尝试编译OP的代码,但删除了Try/Finally! (2认同)

Jir*_*riz -2

一项作业

Result := ...;
Run Code Online (Sandbox Code Playgroud)

块中finally缺失。