3

我有一个从类“a”继承的“b”类。在“a”类中有一些代码在事件不为空时执行操作。我需要该代码在应用程序的特定时间在“b”类中触发。所以在'b'中我订阅了一个新的处理程序(事件)。

如果我将自动生成的事件“按原样”保留在“b”类中throw new NotImplementedException();,则代码按预期工作/运行。一旦我删除了 thow 异常,应用程序就不再按预期工作。

那么,throw new NotImplementedException除了抛出异常还有什么用呢?

我意识到此时我可能正试图以错误的方式解决我的编码问题,我相信我会找到更好的方法来做到这一点(我仍在学习),但我的问题仍然存在。为什么那行会改变代码的结果?

编辑:我意识到我的代码不是很具体。不幸的是,由于严格的政策,我不能。我在“a”类中有一个 if 语句。

if (someEvent != null)

当代码“工作”时,if 语句返回 true。当它没有按预期工作时,它会返回“false”。在“b”类中,应用程序“工作”(或 if 语句返回 true)的唯一时间throw new NotImplementedException();是当我附加新事件时自动生成的“b”类事件方法中的行。

4

5 回答 5

6

想一想:如果你想用下面的方法添加两个整数怎么办......

private int Add(int x, int y)
{

}

...并且内部没有执行此操作的代码(该方法甚至不返回整数)。这就是NotImplementedException用途。

于 2012-04-17T14:37:22.297 回答
3

NotImplementedException只是一个例外,当您尝试执行的代码尚未编写时使用。它通常在片段中用作占位符,直到您填写使用实际代码生成的任何内容的主体。

使用 aNotImplementedException而不是空代码块是一个很好的做法,因为它会非常清楚地引发错误,提醒您代码部分尚未完成。如果它是空白的,那么该方法可能会运行并且什么都不会发生,有时调试起来很痛苦。

于 2017-07-03T22:20:52.660 回答
2

这只是一个异常,至于为什么它意味着您的应用程序“工作”完全取决于处理任何异常的代码。

它不是一个“特殊”的例外,而不是一个正常的例外(除了Exception像其他例外一样)。您倾向于将其与代码生成一起视为实现它所放入的成员的占位符。这样做比让代码生成尝试理解成员结构以输出编译代码要容易得多。

当您说“不再按预期工作”时,我假设它可以编译。如果删除它会阻止代码编译,那么很有可能您会遇到关于返回值的编译错误。

也许触发事件的代码需要处理程序的特定响应,或者如果没有处理程序或异常发生,它会默认响应并继续。在您的情况下,有一个处理程序并且没有异常,因此它期望得到更好的响应?

完全猜测。

如果a您需要使用 in 中的代码b,请考虑创建包含代码的方法,protected并且virtual如果您需要override该行为,则可以选择创建。

于 2012-04-17T14:35:04.467 回答
2

我相信NotImplementedException有一点特殊含义:“这段代码仍在开发中,需要更改”。开发人员放置此异常是为了使某些代码可编译,但不可执行(以避免数据损坏)。

有关此异常类型的信息可以在文档中找到,它非常详细地解释了含义:https ://docs.microsoft.com/en-us/dotnet/api/system.notimplementedexception?view=netcore-3.1

一些开发工具,例如 Resharper,会生成内部带有NotImplementedException的新成员,从​​而保护您免于执行尚未准备好的代码。同时,他们以与“//todo:”注释相同的方式突出显示此异常

对于其他情况,例如,当您不需要实现接口或虚拟成员时,或者可能,您没有在 switch/case、if/else 等语句中实现某些路径时,您可能会使用 NotSupportedException、OutOfRangeException , ArgumentNullException, InvalidOperationException 等。

最后,考虑这种情况以了解NotImplementedException的目的:我们正在编写银行应用程序,并且目前实现汇款功能,我们有:

public void Transfer(sourceAccount, destAccount, decimal sum)
{
   sourceAccount.Credit(sum);
   destAccount.Debit(sum);
}

在这里,我们调用了两个尚不存在的方法。我们使用默认的NotImplementedException生成两者,并使用第一个(Credit)来实现它。可以说,实现需要一些时间,我们已经为它编写了测试,甚至做了几次手动测试。我们完全忘记了第二种方法“借记”并将我们的应用程序部署到测试版,甚至部署到生产环境。测试人员或用户开始使用我们的应用程序,他们很快就会使用汇款功能。他们正在尝试调用Transfer,这向他们显示了一条一般消息“我们很抱歉,我们遇到了一些错误”,同时我们作为开发团队收到有关NotImplementedException的通知堆栈跟踪将我们指向方法“借记”发生。现在我们正在实施它,并发布新版本,可以进行汇款。现在想象一下,如果那里没有例外,会发生什么:用户会花费大量资金尝试进行转移,尝试多次,每次都将资金投入到一个洞里。根据应用程序的用途,问题可能更大或更小:可能是计算器上的按钮不起作用,或者可能是科学计算器,我们在计算针对某些攻击性病毒的疫苗代码时错过了一些重要的数学运算。

于 2020-05-14T22:15:58.323 回答
1

NotImplementedException是一种声明 aninterface或 base的特定方法class根本没有在您的类型中实现的方式。这是E_NOTIMPL错误代码的异常形式。

一般来说,一个实现不应该抛出一个NotImplementedException,除非它是该特定的特别支持的场景interface。在绝大多数情况下,情况并非如此,类型应该完全实现interfaces

就它在做什么而言。它只是抛出一个异常。除非你给我们更多的信息,否则很难说为什么程序在面对异常时保持功能并且在没有它的情况下中断。

于 2012-04-17T14:38:14.877 回答