【问题标题】:Delphi - Value Assigned to 'x' never usedDelphi - 从未使用过分配给“x”的值
【发布时间】:2012-06-16 01:07:29
【问题描述】:

假设我有以下代码:

function DoSomething:Boolean;
var obj : TMyObject;
i : Integer;
begin
  Result := False; //We haven't executed GetValue() correctly yet
  obj := TMyObject.Create();
  try
    //perform some code that may produce an exception        
    i := obj.GetValue();
    //Set the return to True as we executed GetValue() successfully
    Result := True;
  finally
    //do some cleanup
    obj.Free; 
  end;
end;

Delphi 编译器抱怨分配给 Result 的值从未在第一行中使用。

我可能遗漏了一些明显的东西,但我不明白为什么编译器会优化它(如果优化已打开)。

我一直被教导明确设置我的变量,以免混淆它们的值是什么。最重要的是,如果GetValue() 函数产生异常,Result := True; 行将永远不会执行。所以我们受 Delphi 初始化变量的支配。

那么这是安全/可接受的代码吗?我是否应该简单地删除该方法的第一行,这会使其更难阅读?如果失败,我将不得不关闭特定的编译器警告,但我不愿意这样做,因为此警告消息可以提供有用的信息。

【问题讨论】:

标签: delphi compiler-warnings


【解决方案1】:

您的函数只有两个结果。它要么返回True,要么引发异常,因此您可以将其转换为过程,而不是使警告消失。

如果您希望函数的结果在GetValue() 引发异常时为False,您必须在DoSomething 中捕获该异常并将返回值设置为False。在这种情况下,您应该启动函数,将返回值初始化为 True

类似这样的:

function DoSomething:Boolean;
var
  obj : TMyObject;
  i: Integer;
begin
  Result := True;
  obj := TMyObject.Create();
  try
    try
      i := obj.GetValue();
    except
      Result := False;
    end;
  finally
    obj.Free;
  end;
end;

【讨论】:

  • 所以我应该有一个嵌套的try..except :(
  • 如果这是你想要的。当函数向调用者引发异常时,不应使用函数 DoSomething 的返回值,因此不应使用将 Result 初始化为 False。要么在DoSomething 中处理异常,要么在更高层处理..
  • -1 这个答案大错特错。问题中的代码可能会引发异常。此答案中的代码会吞下异常。这两段代码的行为截然不同。
  • @DavidHeffernan 我猜你错过了我回答的这一部分“如果你想要函数的结果......”。是的,它改变了函数的行为。
  • 我明白不要吞下所有的例外。在我的特定实例中,可以抛出异常并且应用程序可以继续执行。
【解决方案2】:

编译器是正确的。将 False 分配给 Result 是徒劳的,您的函数可以返回的唯一值是 True。

两种可能的执行路径是:

  1. 该函数不会引发异常并返回 True。
  2. 该函数确实引发了异常,因此根本不返回结果值。

解决方法很简单,去掉设置 Result 为 False 的那行代码。此时,返回值毫无用处,您可以简单地将函数转换为过程。

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 1970-01-01
    • 2022-12-12
    • 2020-05-04
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多