结果附加或异常

Result attached or exception

假设我有一个函数 f,它应该通过调用 g return 和 attached T。但是,g return 是 detachable T。如果 g 导致 Void,我想引发这样的异常:

f: T
  do
    if attached g as res then
      Result := res
    else
      raise
    end
  end
  
raise
  do
    (create {DEVELOPER_EXCEPTION}).raise
  end

在此设置中,EiffelStudio 在 f 的末尾给我一个错误 VEVI: Variable is not properly set. Variable: Result

确实,Result在f结束时可以为Void,但在这种情况下执行不应该到达f结束,应该引发异常。

如何重构代码以获得类似的结果?

刚发现在这种情况下可以使用checks:

f: T
  do
    if attached g as res then
      Result := res
    else
      raise
    end
    check attached Result then end
  end

但是,我想知道是否有更清洁的方法。

如果引发异常的类型无关紧要,则以下代码将起作用:

f: T
    do
        Result := g
        check is_g_attached: attached Result then end
    end

如果引发异常的类型很重要,可以使用后置条件 False 来扩充特征 raise,表明该特征从不 returns。然后,代码看起来像

f: T
    do
        Result := g
        if not attached Result then
            raise
        end
    end

raise
    do
        (create {DEVELOPER_EXCEPTION}).raise
    ensure
        False
    end