【问题标题】:Eiffel exception not work埃菲尔例外不起作用
【发布时间】:2014-01-09 11:56:15
【问题描述】:

我正在尝试使用下面类中的异常,但是当我调用 kivetel 方法时程序总是失败。我认为它只会调用重试部分,而不是满足后置条件。但它因“y_above_zero”postcond 违规而失败。

class
KEYWORDS
create
    make
feature
    y:INTEGER

make
do
end

kivetel
do
ensure
    y__above_zero: y > 0
rescue
    y := 20
    retry
end
end

【问题讨论】:

  • 它是您运行的确切代码吗?我刚刚检查过,它按预期对我有用。
  • 是的,这正是我班级的代码
  • 我想知道,你是在 EiffelStudio 下运行它吗?如果是,则调试器将捕获后置条件违规并弹出一个对话框以中断、继续或忽略。如果您选择“继续”,则应继续执行而不再次提出后置条件。我刚刚检查了 EiffelStudio 13.11(但我确信它与以前的版本相同)
  • 刚刚下载了 eiffel studio 就像 4 天前所以我有最新的我认为,我点击继续而不是确定不再失败,但这是正常的吗?我认为它不会丢弃任何错误消息,因为存在异常部分
  • 使用条件而不是异常会更简洁:kivetel do if y <= 0 then y:=20 end ensure y__above_zero: y > 0 end

标签: exception rescue eiffel post-conditions


【解决方案1】:

这是在 EiffelStudio 下(即在调试器下)运行时的预期行为。 如果你在外面运行它......例如从控制台,你不会注意到任何东西,执行将通过救援子句并重试并按预期继续。

但在调试器下,只要有断言冲突或异常,调试器就会捕捉到它并弹出对话框。

(请注意,如果这真的让您感到困扰,可以忽略特定类型的异常)。

【讨论】:

  • 我希望有一种方法可以忽略捕获的异常。
  • EiffelStudio 有一种方法可以告诉调试器忽略异常。 Manu执行>异常处理...
【解决方案2】:

所示示例不代表异常处理,原因如下:

  1. do...end 块中没有异常
  2. 常规kivetel 不执行任何操作,因此不会引发异常
  3. 例程kivetel 不正确(它不满足后置条件)。

所以基本上你的rescue 块不会被调用,因为触发的异常(违反后置条件)不会在例程内引发。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2018-12-11
    • 2015-12-06
    相关资源
    最近更新 更多