gpt4 book ai didi

exception - Eiffel 中的错误处理示例

转载 作者:行者123 更新时间:2023-12-01 18:42:19 25 4
gpt4 key购买 nike

我在 Eiffel 中找不到任何实际的错误处理示例。我只找到一些例子,要么是微不足道的,要么完全忽略错误,要么将错误处理留给读者。我有兴趣了解在没有异常的情况下错误如何通过调用堆栈。例如,我想知道发送网络请求的应用程序如何通知用户在调用链中检测到的网络问题。类似这样的事情。

--

编辑:我确实知道 Eiffel 中错误处理的基础知识(状态和异常)。但是,我找不到任何关于应用程序如何通过状态处理错误的实质性示例。故障状态如何链接?

最佳答案

Eiffel 提倡使用对象状态而不是异常。在这种情况下,客户可能会弄​​清楚在发生错误时他们期望什么并正确处理它。例如,

has_error: BOOLEAN
-- Has operation terminated with an error?

error_code: INTEGER
-- Last error code or `no_error'.

is_closed: BOOLEAN
-- Is connection closed?

response: detachable RESPONCE
-- Last response if `not has_error'.

send_request (data: REQUEST)
require
is_open: not is_closed
do
...
ensure
is_closed: is_closed implies (has_error and not connection.is_open)
is_successful: not has_error implies attached response
end

然后,客户端可以推断供应商对象的状态并继续以可预测的方式使用它:

interface.send_request (...)
if interface.is_closed then
... -- The connection is unusable and should be reestablished.
elseif interface.has_error then
... -- Inspect `interface.error_code', possibly trying to resend the request.
else
... -- Use `interface.response' to continue processing.
end

在存在异常的情况下,除了某些文档之外,我们无法推断出在什么情况下应该做什么。此外,它还阻止使用自动工具来轻松检查上面代码中的 response 的使用是否完全有效。

如果堆栈深处发生错误,可以使用异常机制与救援/重试。然而,它可能会在低层网络组件和用户界面之间引入与网络故障细节无关的紧密耦合。在最简单的情况下,网络类将使用适当的消息调用{EXCEPTIONS}.raise。更具体的方法是创建一个 EXCEPTION 类型的对象(或后代),通过调用它的 set_description 来设置相应的消息,并通过以下方式引发异常:调用加注。处理异常的用户代码可能如下所示。

local
is_retried: BOOLEAN
e: EXCEPTIONS
do
if is_retried then
-- There was an exception, handle it.
create e
if e.developer_exception_name ~ "This error" then
... -- Do something.
elseif e.developer_exception_name ~ "That error" then
... -- Do something else.
else
... -- Report yet another error.
end
else
... -- Some code that may fail with an exception.
end
rescue
if not is_retried then
is_retried := True
retry
end
end

编辑

处理嵌套错误的具体方法取决于应用程序设计,似乎与语言无关。可能的替代方案是:

  1. (如果使用异常机制,不推荐。)捕获(较低级别)异常并处理它以恢复类不变式后,会引发新的异常,而不会取消该异常前一个。然后,可以(递归地)使用查询{EXCEPTION}.cause来访问嵌套的异常对象。

  2. 可以使用与前一个类似的机制。然而,类可以将详细信息请求委托(delegate)给较低级别​​的类,而不是创建新对象。例如,

    class A feature
    has_error: BOOLEAN
    do
    Result := nested.has_error
    end
    error: STRING
    do
    Result := "Cannot complete operation X. Reason: " + nested.error
    end
    feature {NONE}
    nested: B
    end

    class B feature
    has_error: BOOLEAN
    do
    Result := nested.has_error
    end
    error: STRING
    do
    Result := "Cannot complete operation Y. Reason: " + nested.error
    end
    feature {NONE}
    nested: C
    end
  3. 可以使用日志记录设施。他们可以区分错误严重性、指定来源等。

    class A feature
    do_something
    do
    nested.whatever
    if nested.has_error then
    log.error ("Cannot complete operation X.")
    end
    end
    has_error: BOOLEAN do Result := nested.has_error end
    feature {NONE}
    nested: B
    end

    class B feature
    whatever
    do
    nested.try_something
    if nested.has_error then
    -- An error has been reported by "nested".
    elseif something_else_goes_wrong then
    has_inner_error := True
    log.error ("Something goes wrong.")
    elseif has_minor_issues then
    log.warning ("Be careful.")
    end
    end
    has_error: BOOLEAN do Result := nested.has_error or has_inner_error end
    has_inner_error: BOOLEAN
    -- Some error that is not one of the errors reported by `nested'.
    feature {NONE}
    nested: C
    end

关于exception - Eiffel 中的错误处理示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26956743/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com