什么"抛出新的NotImplementedException();"做到了吗?

时间:2012-04-17 14:34:00

标签: c# .net

我有一个继承自'a'类的'b'类。在类'a'中,如果事件不为null,则会有一些代码执行操作。我需要在应用程序的特定时间内在类'b'中触发该代码。所以在'b'中我订阅了一个新的Handler(事件)。

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

那么除了抛出异常之外,throw new NotImplementedException做了什么?

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

编辑: 我认为我对代码并不十分具体。不幸的是,由于严格的政策,我不可能。我在课堂'a'是if语句。

if (someEvent != null)

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

5 个答案:

答案 0 :(得分:6)

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

private int Add(int x, int y)
{

}

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

答案 1 :(得分:3)

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

与正常异常相反,它不是“特殊”异常(除了像Exception那样派生之外)。您倾向于将代码生成视为占位符,以实现其内部的成员。这样做要比代码生成试图理解成员结构以输出编译代码要容易得多。

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

触发事件的代码可能需要处理程序的某个响应,或者如果没有处理程序或异常,则默认响应并继续。在您的情况下,有一个处理程序,没有异常,所以它期望更好的响应?

完全猜测。

如果您需要在a中使用b中的代码,请考虑制作包含代码protected和可选virtual的方法,如果您需要{ {1}}行为。

答案 2 :(得分:2)

NotImplementedException是一种声明interface或基础class的特定方法在您的类型中未实现的方式。这是E_NOTIMPL错误代码的异常形式。

通常,实现不应该抛出NotImplementedException,除非它是特定interface的特定支持方案。在绝大多数情况下情况并非如此,类型应完全实现interfaces

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

答案 3 :(得分:1)

我相信

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 )来实现它。可以说,实现花费了一些时间,我们为此编写了测试,甚至还进行了一些手动测试。我们完全忘记了第二种方法“ 借记”,而是将我们的应用程序部署到Beta甚至是生产环境。测试人员或用户开始使用我们的应用程序,很快他们就会使用汇款功能。他们正在尝试致电 Transfer ,这向他们显示了一条一般性消息:“我们很抱歉,我们遇到了一些错误”,与此同时,作为开发团队,我们收到了有关 NotImplementedException 的通知。 strong>发生了堆栈跟踪,将我们指向了方法“ 借方”。现在我们正在实施它,并发布新版本,可以进行汇款。 现在想象一下,如果那里没有例外,那将会发生什么:用户将花费大量金钱来尝试进行这种转移,尝试几次,每次都将钱扔进一个洞。 根据应用程序的目的,它可能是大大小小的问题:计算器上的按钮可能不起作用,或者是科学计算器,我们只是在针对某些侵略性病毒计算疫苗代码时错过了一些重要的数学运算。

答案 4 :(得分:0)

NotImplementedException只是一个例外,当你还没有编写你想要做的事情的代码时使用它。它通常在片段中用作占位符,直到您填写实际代码生成的内容为止。

最好使用NotImplementedException而不是空代码块,因为它会非常明显地引发错误,提醒您代码部分尚未完成。如果它是空白的,那么该方法可能会运行并且不会发生任何事情,有时候调试很麻烦。