- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
既然这方面有很多模糊之处,我们能否提出一些清晰、简单且易于使用的规则?
这是第一次尝试,这三个规则应该足以满足所有情况。
<小时/>第一条规则基于通用原则,即方法的实现细节不应暴露给调用者:
规则 1:检查的异常不应向调用者公开实现细节:您可以这样测试它:如果您完全更改实现但仍然期望该方法履行其契约(就像在重构中),抛出异常仍然有意义吗?如果是,那么它应该是一个已检查的异常,因为它不是实现细节,而是方法所填充的用例的一部分。如果不是,则应取消检查异常,因为它是不应向调用者公开的实现细节。
如果根据规则 1 应检查异常(exception)情况,然后应用规则 2:
规则 2:由于检查异常是方法契约的一部分,因此违反方法契约的行为不能成为检查异常。例如,此方法从其参数执行 sql 查询:
executeSqlQuery(String sqlQuery)
如果调用者提供的字符串不是 SQL 查询,那么他违反了该方法的输入条件,并且必须取消检查所产生的异常。
如果基于规则 2,异常看起来仍然像是已检查,则应用规则三来检查该方法是否遵循另一个最佳实践:单一职责原则
规则 3:方法应该只做一件事。例如方法
List.get(int索引)
只正确地做了一件事:从列表中返回所需的元素。并且不尝试实现另一个常见用例:检查元素是否存在。另一方面方法
findById(Long id) 抛出 RecordNotFoundException
错误地尝试混合这两个函数,从而迫使所有调用者始终考虑找不到记录时的用例,即使他们知道记录存在。
<小时/>是否缺少某些规则,或者我们可以进一步简化和澄清规则吗?
<小时/>背景:关于这个话题有很多不同的观点。有很多“激进”解决方案的支持者,例如永远不要使用检查异常(一些 Java 书籍或 C# 设计者),或者几乎所有内容都应该是检查异常(java.io 包中的 IOException 或 JDBC 中的 SQLException)。至少相同数量的 View 建议使用这两种类型,但提供了主观和模糊的规则来在它们之间做出决定,而没有冗长的解释,而这些解释往往会丢失,而不是带来更多的困惑(例如:如果调用者有理由这样做)从异常中恢复而不是应该检查。再次尝试调用是否是合理的恢复?对于某些客户端来说可能是。“合理”和“恢复”这两个词太含糊了。)
最佳答案
嗯,这个问题在官方 Java Tutorials 中有答案,事实上:
Here's the bottom line guideline: If a client can reasonably be expected to recover from an exception, make it a checked exception. If a client cannot do anything to recover from the exception, make it an unchecked exception.
对我来说,这看起来是一个非常清晰、简单的规则。
编辑:您的背景编辑很好地解释了您的困惑和沮丧。如果你愿意,我可以想出一个更简单的规则:
Always be usable. Try to be practical where possible. Strive to be consistent.
重点是,异常处理是可能抛出异常的方法的用户必须执行的操作。遗憾的是,Java 强制编写该方法的人为该方法的用户做出选择。因此,我稍微倾向于“从不检查”方面,因为您的方法将始终可用。对于某些情况,例如网络 I/O,强制用户构建一些错误处理可能确实实用,但情况并不常见。如果您问自己嗯,我的最后 400 个方法都抛出了 RuntimeError
,现在应该抛出一个已检查的异常吗?,获得一致性可能使您的库的使用更加实用。
遗憾的是,这条规则更容易,但并不更清晰,因为至少实用和一致是非常主观的概念。所以你现在遇到的问题实际上是风格的问题。
关于java - 用于在检查异常和非检查异常之间做出决定的清晰简单的规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29331615/
这是一道函数依赖题。 我知道当 x->yz 然后 x->y 和 x->z 时。但是上面的依赖关系可能吗? 最佳答案 If xy determines z can x determine z and y
我有一个奇怪的问题。 Line 61: $this->_currentRoute = Default_Model_Routes::getInstance()->getCurrentRoute(); .
我正在开发一种工具来比较两个波形文件的波形相似性。例如,我有一个持续时间为 1 分钟的波形文件,我使用第一个波形文件制作了另一个波形文件,但每 5 秒生成一次数据,间隔为 5 秒至 0。 现在我的软件
我遇到了一个奇怪的问题,尽管我打赌有一个巧妙的方法可以解决它。 情况是我有一个具有三列排序状态的表:完全未排序,在这种情况下我不希望出现任何图标,按升序排序,在这种情况下我想要一个向上箭头,以及按降序
Java 语言规范提供了criteria用于确定(格式良好的)执行是否满足“Java 内存模型的因果关系要求”。让我们假设执行是有限的。我试图了解是否存在多项式时间算法来证明或反驳这种情况。 真的,我
Java 语言规范提供了criteria用于确定(格式良好的)执行是否满足“Java 内存模型的因果关系要求”。让我们假设执行是有限的。我试图了解是否存在多项式时间算法来证明或反驳这种情况。 真的,我
我正在编写一个简单的Bank类,其中包含Account。我希望人员能够开设一个新的受密码保护的银行帐户,并从其帐户中提取和存入资金。账户设在银行内。银行和帐户类应提供哪些服务? 假设 p 已在银行 b
我的标题概括了这一点。我有一个将要开发的简单业务线应用程序,并且很好奇如何确定我应该针对哪个 .NET 版本。支持 Win XP SP3 会很好,但不是必需的。它将用于索引多页 tiff,因此导入一批
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 你是否真的“尝试过”(意味着在其中编程,而不仅仅是阅读有关它的文章)Erlang并决定在项目中
我正在尝试使用 ExceptionFilterAttribute 为 Web Api 实现异常处理。我已经继承了ExceptionFilterAttribute 类并覆盖了onException 方法
前一段时间在一次编程比赛中我遇到了一个令人费解的问题,此后一直困扰着我。虽然我没有逐字记住,但我会尽力重现: Jack starts at 0 on the number line and jumps
我有什么: 我有一个主要内容区域,后面跟着两个旁白: #primary,#secondary,#tertiary{float:left; width:33%;} Primary
我无法正确操作键盘。 整个 View 充满了文本字段。 当我使用通知将 View 向上移动时,上方的文本框不再可见: override func viewDidLoad() { super.v
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
我在尝试获取父对象来过滤子事件时遇到问题。 在下面的示例中,我在旋转框上设置了一个事件过滤器。事件过滤器检测旋转框上的鼠标按下事件。然后,我希望父对象根据某些标准接受或忽略该事件。 问题是它似乎接受了
我使用从 std::system_error 继承的类进行错误处理,我想控制调用 what() 时返回的内容。原因:标准(C++11 和 C++1y CD 草案 - N3690,下面的 § 引用是后者
我正在用 Swift 构建一个 iOS 应用程序,它的起始页有 6 个按钮。这些按钮中的每一个都将连接到一个 TableView Controller ,其数据由 NSFetchedResultsCo
我想构建这样的东西 数据存储| mycode.py | RESTful API | mywebapp.py(Django 或 Tornado) 我检查了 Django 的 Piston,但似乎这样我就
究竟如何更改 RichTextBox 中的字体? 环顾四周给了我似乎不再有效的旧答案。我认为这就像执行 richtextbox1.Font = Font.Bold; 或类似操作一样简单。原来不是,所以
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 7 年前。 Improve this qu
我是一名优秀的程序员,十分优秀!