- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 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
编辑
处理嵌套错误的具体方法取决于应用程序设计,似乎与语言无关。可能的替代方案是:
(如果使用异常机制,不推荐。)捕获(较低级别)异常并处理它以恢复类不变式后,会引发新的异常,而不会取消该异常前一个。然后,可以(递归地)使用查询{EXCEPTION}.cause
来访问嵌套的异常对象。
可以使用与前一个类似的机制。然而,类可以将详细信息请求委托(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
可以使用日志记录设施。他们可以区分错误严重性、指定来源等。
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/
这个问题在这里已经有了答案: Python try...except comma vs 'as' in except (5 个回答) 关闭7年前。 在python中,有两种方法可以捕获异常 excep
在 Java 中,我有一个从 Exception 扩展的异常类,但是每当我抛出它时,编译器都会说它需要被捕获/必须声明方法 throws异常。 当我使用从 Exception 扩展的 RuntimeE
我有一组用户、组以及用户和组之间的映射。我有各种操作这些集合的函数,但是不能为不存在的用户添加用户组映射,也不能删除仍然有用户作为成员的组等。 所以基本上我希望这些函数抛出必须由调用者明确处理的“异常
我正在尝试使用上载控件上载20兆的文件,并且在Visual Studio的内置Web服务器上可以正常工作,但是一旦将其发布到生产服务器(我无权访问),我总是收到以下错误消息: Server Error
我想断言运行某些代码时会引发特定异常(SSLHandshakeException)。 assertThatThrownBy(() -> { // some code }).is
这个问题我暂时解决不了。我很乐意提供一些建议。 当我尝试抛出异常时(我自己创建了一个 Java 风格的异常) throw Exception (); 编译器提出抗议: DataTypes/Date.c
我有以下文件: from fabric.api import env, execute, run env.hosts = ['1.2.3.4'] def taskA(): run('ls')
我正在阅读一些包含类似于以下功能的源代码: def dummy_function(): try: g = 1/0 except Exception as e:
根据标准 ML 的定义(修订版): The idea is that dynamic evaluation of a non-expansive expression will neither gen
当 GHCi 在运行时发现调用产生的值与函数的模式匹配不匹配时,有没有办法让 GHCi 产生更好的异常消息? 它目前给出了产生非详尽模式匹配的函数的行号,虽然有时会有所帮助,但确实需要一轮调试,有时我
我有一个最佳实践问题。我意识到这是主观的,但想问问比我更聪明的人,这是否是一种常见的编程实践。 如果您有一种不希望干扰应用程序重要功能的非关键方法,那么使用这样的错误接收器是否常见? Try
在编程中,异常是否总是错误(被零除,访问冲突等等)? 如果不是,您能否提供不是错误的异常示例? 谢谢。 最佳答案 异常通常用于管理错误,它们使错误处理更加容易,但它们并不总是错误。 任何需要单独代码路
我很想知道 OCaml 运行时如何处理异常以使它们如此轻量。他们是使用 setjmp/longjmp 还是在每个函数中返回一个特殊值并传播它? 在我看来,longjmp会给系统带来一点压力,但只有在引
在我的 C# 代码中,我可以访问 MyNamespace.Exception 以及 System.Exception。当我想捕获其中一个异常时,理想情况下我会完全限定要捕获的异常或使用别名来明确说明。
我正在使用 Visual C++ 2005 Express Edition 并遇到以下链接器错误: 19>mylib1.lib(mylibsource1.obj) : error LNK2019: u
这个问题在这里已经有了答案: Is there "Break on Exception" in IntelliJ? (6 个回答) 关闭7年前。 我想在调试器中运行我的测试套件并中断任何意外异常,但是
Like in this picture 我知道它们都可以正常工作,但我只是想知道它们之间有何不同? PS:我是初学者。 最佳答案 A LogEvent可以同时包含消息和异常。如果您使用第一种形式:
我知道避免 Doctrine 上的异常似乎是一种奇怪的行为,但我需要这样做,因为我在一个旧项目中工作,过去有人执行了一些迁移,然后他决定删除它,所以现在复制起来很复杂本地生产环境没有崩溃,这就是为什么
我想创建一个名为 SecurityException 的新异常。 我应该把代码放在哪里? class SecurityException extends CakeException {}; 谢谢! 最
我一直在使用throw new Exception("...")在我的代码中,因为我找不到其他可以使用的东西。我正在寻找像 C++'s 这样的东西 out_of_range 和 logic_error
我是一名优秀的程序员,十分优秀!