2

假设我有一个函数应该通过调用f返回一个. 但是,返回一个. 如果导致无效,我想引发这样的异常:attached Tggdetachable Tg

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

在此设置中,EiffelStudioVEVI: Variable is not properly set. Variable: Resultf.

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

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

4

2 回答 2

2

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

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

如果引发异常的类型很重要,则可以使用表明该功能永远不会返回raise的后置条件来扩充该功能。False然后,代码看起来像

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

raise
    do
        (create {DEVELOPER_EXCEPTION}).raise
    ensure
        False
    end
于 2021-02-22T20:06:34.540 回答
1

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

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

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

于 2021-02-22T19:22:36.030 回答