如何说服其他开发者不要忽视异常?

时间:2010-03-16 12:46:40

标签: java exception try-catch

最近我在另一个开发人员接管的应用程序中遇到了一个错误。我调试了原因,一个多小时后我意识到,问题不是产生异常的代码,而是在返回错误数据之前执行的一些代码。如果我潜入这里,我遇到了以下情况:

try {
  ...
} catch (XYException e){}

如果Exception会被传播(我做了一个更改),我会在几分钟内找到错误的原因,因为stacktrace已经指出了问题。那么如何说服其他开发人员永远不会以这种方式捕获和忽略异常呢?

9 个答案:

答案 0 :(得分:16)

简单的经验法则:当且仅当您有一种有意义的处理方式时才会捕获异常。在你的工作场所做任何你需要做的事情来传播这个简单的规则。

通过使用PMD等工具,您甚至可以在所有开发人员的开发环境中强制执行此操作。 EmptyCatchBlock(基本规则下的第一条规则)是一条完全符合您需求的规则。如果您需要更好地控制异常处理,还需要更多out-of-the-box rules for exceptions

尽管如此,根据我的经验,强制使用PMD等工具绝不能代替正确的开发实践和开发人员教育。

答案 1 :(得分:5)

开始BadHumour:

  

添加无声的关键   导致代码的异常   关闭的申请,和   让他们坐下来哭泣试图找到它   大约一个小时 - 然后教育

结束BadHumour

简单的规则很简单:在特殊情况下使用例外。其他任何事都是愚蠢和浪费。比较吞咽糖果涂层剃刀刀片的例外情况。它们现在可能味道不错,但要等到它们开始被消化。 (编码测试系统与调试实时系统)

答案 2 :(得分:3)

简单点 - 让首席开发人员宣布这一点。捕捉异常并无理由吞下它就等于破坏并且应该导致对开发者的递归(即谈谈他的态度)。

正如尤瓦尔所说,只有在你真正做一些明智的事情时才能抓住例外。如果你不知道什么或如何处理它们,就会让事情冒出来。可能会将它们包含在IF预期的其他异常中(即DAL可能会抛出一个DataLayerException,以便更高的级别可以在一次try / catch中处理所有这些东西,但它不会处理意外的事情。)

抓住异常并吞下它们是一种荒谬的方式。

答案 3 :(得分:2)

与说服其他开发者遵循任何最佳做法的方式相同。这种特殊的反模式是一种相当常见的(并且非常痛苦!),但是其他无数编码实践的例子在你的团队成员中可能至少有点普遍。

为了开始有困难,这里有一些我过去曾见过有效使用过的建议:

  1. 与开发人员交谈,指出问题,并描述它是如何给您带来问题的。最简单的解决方案 - 并不总是有效,它只适用于那个开发人员,但它比什么都不做要好。
  2. 公众羞辱。我曾经在我们有一个“羞耻之墙”的地方工作,我们的项目中有各种编码恐怖,以及编写它们的开发人员。真正重要的是,这是以轻松愉快的方式完成的,而且我不会建议在没有让所有人参与的情况下开始,但这是指出这类问题的有趣方式。
  3. 阅读小组。如果您有办法在办公室开始午餐时间阅读小组,我强烈推荐。这样的编码问题将由阅读小组通过“实用程序员”来解决。
  4. 代码评论。再说一次,如果你不是团队领导者,那么开始并不是最简单的事情,但如果你不是团队领导者,那绝对值得给你一个建议。如果您是团队负责人,那么您应该在昨天开始进行代码审查。

答案 4 :(得分:1)

将他们指向此链接http://www.ibm.com/developerworks/library/j-jtp05254.html,该文章说明何时检查或取消选中或投掷或捕获:)

答案 5 :(得分:1)

我喜欢VS.Net调试器的一个很好的功能是你可以告诉它在抛出任何异常时中断。这不是你会一直打开的东西,但是当你试图追捕某个特定的bug时可以提供帮助。我想知道Java是否存在相同的功能,因为它是一个非常类似于.Net的环境。我认为这个问题在Java中比在.Net中出现的更多,但是,因为Java要求你处理异常,或者至少将你的方法标记为抛出相同的异常(AFAIK)。所以,如果你需要处理它,许多糟糕的开发人员只会吞下它,因为他们不知道如何处理它,或者如何处理它。

这些都不能帮助你阻止糟糕的开发人员做坏事。我认为你能做的最好的事情就是进行代码审查。鼓励同事查看签到列表以确保正确完成任务。有了良好的源控制系统,这可以很容易地完成。人眼可以捕捉到计算机无法捕捉的东西。计算机可以删除一个空的捕获块,但人类可以捕获更多的反模式。

答案 6 :(得分:1)

标题与示例不符。在示例中,异常不会被忽略,但是处理会以令人讨厌的方式(这有时被称为异常吞咽)。对于这个特殊的疾病,我建议静态代码分析和奖金/工资减少。

答案 7 :(得分:0)

向相关开发人员或相关模块收取时间,而不是您自己或您自己的模块。

答案 8 :(得分:-1)

有一些微妙的方法(每个都是讨论主题)

  • 制作所有应用程序的异常RuntimeException子类。这样,你的应用程序中就没有try / catch,你可以很容易地看到(在线程级别)problème打破了线程。不幸的是,这对开发者来说没有任何影响,因为开发人员正好编写了这个代码块,以摆脱他无需管理的异常。
  • 使用Checkstyle或其他静态代码检查程序,确保应用程序中不存在空的catch块。不幸的是,当团队中不存在持续集成过程时,这不起作用(因为错误通知不会发送给负责它们的开发人员)。
  • 提供具有合理值的默认捕获模板代码(如logger.log(Level.WARN, "something went wrong here", e)),允许用户不必担心异常管理,但具有可靠的良好代码。