我相信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的通知堆栈跟踪将我们指向方法“借记”发生。现在我们正在实施它,并发布新版本,可以进行汇款。现在想象一下,如果那里没有例外,会发生什么:用户会花费大量资金尝试进行转移,尝试多次,每次都将资金投入到一个洞里。根据应用程序的用途,问题可能更大或更小:可能是计算器上的按钮不起作用,或者可能是科学计算器,我们在计算针对某些攻击性病毒的疫苗代码时错过了一些重要的数学运算。