【问题标题】:Result attached or exception结果附加或异常
【发布时间】:2021-02-22 19:17:46
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: eiffel void-safety


    【解决方案1】:

    如果引发异常的类型无关紧要,下面的代码就可以了:

    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
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 我认为删除check 永远不会触发编译错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 2014-03-16
      • 2018-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多