最近我在另一个开发人员接管的应用程序中遇到了一个错误。我调试了原因,一个多小时后我意识到,问题不是产生异常的代码,而是在返回错误数据之前执行的一些代码。如果我潜入这里,我遇到了以下情况:
try {
...
} catch (XYException e){}
如果Exception会被传播(我做了一个更改),我会在几分钟内找到错误的原因,因为stacktrace已经指出了问题。那么如何说服其他开发人员永远不会以这种方式捕获和忽略异常呢?
答案 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)
与说服其他开发者遵循任何最佳做法的方式相同。这种特殊的反模式是一种相当常见的(并且非常痛苦!),但是其他无数编码实践的例子在你的团队成员中可能至少有点普遍。
为了开始有困难,这里有一些我过去曾见过有效使用过的建议:
答案 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打破了线程。不幸的是,这对开发者来说没有任何影响,因为开发人员正好编写了这个代码块,以摆脱他无需管理的异常。logger.log(Level.WARN, "something went wrong here", e)
),允许用户不必担心异常管理,但具有可靠的良好代码。