eiffel - 结果附加或异常

标签 eiffel void-safety

假设我有一个函数 f,它应该通过调用 g 返回一个 attached T。然而,g 返回一个可分离的 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 给我一个错误 VEVI:未正确设置变量。变量:f 末尾的 Result

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

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

最佳答案

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

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

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

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

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

关于eiffel - 结果附加或异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66322061/

相关文章:

recursion - Eiffel 中的二叉树

eiffel - 使用 Eiffel 的可用处理器数量

eiffel - 如何将自定义 header 的值检索到 WSF_REQUEST 中

void - Eiffel 的附加语句中的局部变量有什么意义?

c++ - 空基优化子对象的地址

null - Eiffel 是否避免所有 null 值?

c++ - Eiffel "create"在 C++ 构造函数上?

oop - Eiffel :放宽前置条件,收紧后置条件?