使用NotImplementedException


15

抛出NotImplementedException尚未编写的代码是否被认为是不好的做法?可能TODO评论会被认为更安全吗?


6
对您使用此类异常的缺点是什么?
SRKX 2012年

@SRKX存在进入生产代码并导致整个代码块无法工作的异常的风险。(还没有发生在我身上,但我们都休假了)我个人使用它们,我担心自己会忽略一些弊端。
汤姆·斯奎尔斯

奇怪的是,没有一个标签指定使用哪种语言。这并不适用于每种通用语言,因为C没有任何种类的异常。伙计们,这里有一个语言标记的空间。
David Thornley,2012年

1
@DavidThornley,该问题最初被标记为C#,因此我阅读了该标记。
svick 2012年

@svick:认为可能是C#。感谢您添加标签。
David Thornley,2012年

Answers:


34

我相信NotImplementedException实际上是一种好习惯。

的确,如果您忘记实现一个方法,然后在项目中稍后使用它(并且相信我,它确实发生了),那么您可能会花费很长时间进行调试,以逐步找出问题所在。如果有异常,程序将直接停止,并提示异常(如果捕获到异常,则可以通过查找所捕获的异常来快速找到它)。

我建议将TODO注释与NotImplementedException 合并注释结合使用,这样可以将GUI帮助(与VS中的任务)和程序安全性结合在一起。

在我看来,对于发行版而言,它甚至更为重要,因为在大多数情况下,您宁愿使程序崩溃,而不是使程序显然运行正常,但产生错误的结果。


6
如果使用Resharper,则它的显示NotImplementedException方式与TODO注释相同。我认为这是一个不错的功能。
svick 2012年

1
进行一些良好的TDD练习,您就会赢得胜利
LRE

7

这取决于您对错误和错误处理的一般理解。我是那种“硬错误”类型的人:我会在出现任何提示时抛出异常,这可能是错误的。我会断言一切;如果有错误,应该有东西存在,没有,或者应该有东西存在,而不应该,那么整个宇宙就必须停止。窗户上的惊呼声必须通过扬声器不祥地响。

有些人宁愿不被错误打扰。那么,如果我们将其交付给客户并且缺少整个报告模块,是因为我们忘记了对它进行编码,而测试中没有人意识到它,因为应用程序对此太沉默了怎么办?最好什么也不做,比在客户面前丢个例外!


就像您希望在Debug和Release中使用不同的行为一样,并且断言并不总是会切掉它。我相信.Net代码合同可以在Release中关闭。
Job

1
我主要使用断言,这些断言在发布时也已关闭。我有自己的断言函数,该函数在调试时会遇到断点,在测试时会引发异常,甚至在发布时也不会编译。
Mike Nakis 2012年

3

我会说这是个好主意。通常,我会看到骨架代码抛出的那些异常,这些异常代码是从表单或图表等自动生成的。该异常提醒我实现代码,并且确保我尝试使用已设置但从未完全实现的功能时会出错。有时,我会将其存根或用不太可能导致执行停止的内容(例如向控制台打印警告)代替它,但是我发现它对我有用。

如果您要构建一个供其他人使用的具有此异常的库,那么它比其他方法要好。替代方法是您的库的用户调用一个函数,并想知道为什么似乎什么也没发生。当然,在发货的库中有此异常仍然很糟糕,但是比静默故障好,IMO。


1

我认为这是个好习惯。另一种选择是传播无效的值或状态,这将影响测试和生产代码。


1
等等...。您的意思是,在您工作的地方,抛出NotImpl的代码将使其一直进行质量检查?甚至投入生产?
史蒂文·埃弗斯

3
不,恰恰相反:NotImpl是一个很好的巨大红色标记/错误情况。但是TODO没有语义价值,可以将其用于测试或生产中,从而使事情悄无声息。(我可以想像有一项从生产中消除TODO的政策,但我们没有这样的规则。)
Larry OBrien 2012年

1

我一直在用NotImplementedException-毕竟这就是它的用途。

这与“快速失败”的概念有关:如果您的代码引发异常,则应在生产之前捕获该异常。如果确实要投入生产,那么至少客户知道组装是不正确的

如果代码返回无意义的值,或者对于void方法不采取任何措施,则代码的使用者可能会合理地认为该调用有意义,而实际上却没有。然后,当他们获得一些正确的代码时,他们的代码可能会中断,因为它取决于以前的错误行为。


0

这是什么样的项目?工作还是在家?在家里,做任何您想做的事-最好的提醒会提醒您您需要完成所从事的工作。

在工作中,完成编写。

我看不到我会签入可能/将破坏其他开发人员,质量检查或构建的代码的情况。


两者都很好,我也尝试在家里坚持良好的做法。
汤姆·斯奎尔斯

0

我在doxygene自动记录工作中只执行\ todo,然后抛出异常。这样一来,如果人们至少不被RTFM困扰,他们将能够弄清楚他们的程序为什么崩溃,而不用想知道为什么有一个声明的函数没有返回逻辑值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.