为什么存在NotImplementedException?

2023-12-14

这真的非常让我感到不安,所以我希望有人能给我一个合理的理由来解释为什么事情是这样的。

NotImplementedException。你在拉我的腿,对吗?

不,我不会廉价地说:“等等,该方法已实现 - 它会抛出 NotImplementedException。”是的,没错,您必须实现抛出 NotImplementedException 的方法(与 C++ 中的纯虚函数调用不同 - 现在这是有道理的!)。虽然这非常有趣,但我脑子里有一个更严重的问题。

我只是想知道,在存在 NotImplementedException 的情况下,任何人都可以使用 .Net 做任何事情吗?您是否希望用 try catch 块包装每个抽象方法调用以防止可能未实现的方法?如果你捕获到这样的异常,你到底应该怎么处理它?

我认为没有办法在不调用方法的情况下测试它是否实际实现。由于调用它可能会产生副作用,因此我无法预先完成所有检查,然后运行我的算法。我必须运行我的算法,捕获 NotImplementedExceptions 以及如何将我的应用程序回滚到某个正常状态。

这很疯狂。疯狂的。疯狂的。所以问题是:为什么会出现NotImplementedException?

作为先发制人的打击,我不希望任何人做出回应,“因为设计者需要将其放入自动生成的代码中。”这太可怕了。我宁愿在您提供实现之前不编译自动生成的代码。例如,自动生成的实现可以是“抛出 NotImplementedException;”其中 NotImplementedException 未定义!

有人曾经捕获并处理过 NotImplementedException 吗?您是否曾经在代码中留下过 NotImplementedException?如果是这样,这是否代表了一个定时炸弹(即,您不小心将其留在那里),或者是一个设计缺陷(该方法不应该被实现并且永远不会被调用)?

我也非常怀疑 NotSupportedException...不支持?什么?如果不支持,为什么它是您界面的一部分?微软的任何人都可以拼出不正确的继承吗?但如果我没有因为这个问题而受到太多虐待的话,我可能会为此提出另一个问题。

附加信息:

This是关于这个主题的有趣读物。

似乎有很强的共识布拉德·艾布拉姆斯“NotImplementedException 是针对尚未实现的功能,但确实应该(并且将会)实现。类似于您可能会执行的操作start当你构建一个类时,获取所有抛出 NotImplementedException 的方法,然后用真实的代码将它们清除......”

评论来自贾里德·帕森斯非常弱,应该被忽略: NotImplementedException:当类型由于任何其他原因未实现方法时抛出此异常。

The MSDN在这个主题上甚至更弱,仅仅指出“当请求的方法或操作未实现时引发的异常”。


我认为在一种情况下它很有用:TDD。

我编写测试,然后创建存根以便编译测试。这些存根除了throw new NotImplementedException();。这样,无论如何,测试都会默认失败。如果我使用一些虚拟返回值,它可能会产生误报。现在所有测试都编译并失败,因为没有实现,我处理这些存根。

因为我从来没有使用过NotImplementedException在任何其他情况下,不NotImplementedException将永远传递到发布代码,因为它总是会导致某些测试失败。

你不需要到处抓它。好的 API 会记录抛出的异常。这些是您应该寻找的。

编辑:我写了一个 FxCop 规则来查找它们。

这是代码:

using System;
using Microsoft.FxCop.Sdk;

/// <summary>
/// An FxCop rule to ensure no <see cref="NotImplementedException"/> is
/// left behind on production code.
/// </summary>
internal class DoNotRaiseNotImplementedException : BaseIntrospectionRule
{
    private TypeNode _notImplementedException;
    private Member _currentMember;

    public DoNotRaiseNotImplementedException()
        : base("DoNotRaiseNotImplementedException",
               // The following string must be the assembly name (here
               // Bevonn.CodeAnalysis) followed by a dot and then the
               // metadata file name without the xml extension (here
               // DesignRules). See the note at the end for more details.
               "Bevonn.CodeAnalysis.DesignRules",
               typeof (DoNotRaiseNotImplementedException).Assembly) { }

    public override void BeforeAnalysis()
    {
        base.BeforeAnalysis();
        _notImplementedException = FrameworkAssemblies.Mscorlib.GetType(
            Identifier.For("System"),
            Identifier.For("NotImplementedException"));
    }

    public override ProblemCollection Check(Member member)
    {
        var method = member as Method;
        if (method != null)
        {
            _currentMember = member;
            VisitStatements(method.Body.Statements);
        }
        return Problems;
    }

    public override void VisitThrow(ThrowNode throwInstruction)
    {
        if (throwInstruction.Expression != null &&
            throwInstruction.Expression.Type.IsAssignableTo(_notImplementedException))
        {
            var problem = new Problem(
                GetResolution(),
                throwInstruction.SourceContext,
                _currentMember.Name.Name);
            Problems.Add(problem);
        }
    }
}

这是规则元数据:

<?xml version="1.0" encoding="utf-8" ?>
<Rules FriendlyName="Bevonn Design Rules">
  <Rule TypeName="DoNotRaiseNotImplementedException" Category="Bevonn.Design" CheckId="BCA0001">
    <Name>Do not raise NotImplementedException</Name>
    <Description>NotImplementedException should not be used in production code.</Description>
    <Url>http://stackoverflow.com/questions/410719/notimplementedexception-are-they-kidding-me</Url>
    <Resolution>Implement the method or property accessor.</Resolution>
    <MessageLevel Certainty="100">CriticalError</MessageLevel>
    <Email></Email>
    <FixCategories>NonBreaking</FixCategories>
    <Owner></Owner>
  </Rule>
</Rules>

要构建它,您需要:

  • 参考Microsoft.FxCop.Sdk.dll and Microsoft.Cci.dll

  • 将元数据放入名为的文件中DesignRules.xml并将其作为嵌入资源添加到程序集中

  • 为您的程序集命名Bevonn.CodeAnalysis。如果要对元数据或程序集文件使用不同的名称,请确保相应地将第二个参数更改为基本构造函数。

然后只需将生成的程序集添加到您的 FxCop 规则中,并从您宝贵的代码中删除那些该死的异常。在某些极端情况下,当抛出异常时,它不会报告 NotImplementedException,但我真的认为,如果您实际上正在编写这样的 cthulhian 代码,那么您是没有希望的。对于正常用途,即throw new NotImplementedException();,它有效,这才是最重要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么存在NotImplementedException? 的相关文章

随机推荐

  • SSMS 能否显示 Azure Synapse 中的实际执行计划?

    我正在研究 Azure Synapse 在专用 SQL 池数据库中 SSMS 的 实际执行计划 被禁用 在无服务器池数据库中 SSMS 显示 不支持设置统计信息 在SQL执行中 我忘记截图了 禁用实际执行计划 的图像是 4 通过选择 执行
  • 根据位置从字符串中删除字符

    有没有一种简单的方法可以从字符串中删除特定字符 在下面的示例中 我想从向量的每个元素中删除最后三个字符 string lt c Autauga AL Bald Win Av Barbour AL Bibb AL Blount At Bull
  • 填充曲线和对角线之间的区域

    你能帮我解决这个问题吗 我想知道如何填充曲线和对角线 连接 X min Y min 到 X max Y max 的线 之间的区域 例如 在下图中我们如何填充上面的区域红色对角线和蓝色下方的区域 提前感谢您的时间和考虑 import nump
  • 打开 js 变量的保存文件对话框

    在我的网络应用程序中 我需要为用户提供将 js 变量保存为文件的选项 当用户单击下载时 应用程序会要求他保存文件 最好是保存为 js 文件 与谷歌文档类似 您可以保存文件 javascript可以通过这种方式传递它的变量吗 查看下载这正是允
  • 在 Excel 中查找范围的第一个非空白单元格的标题索引的公式?

    我有这张表 可以将其视为基本的自定义甘特图 我想根据同一行范围内第一个填充的单元格及其相应列 第 1 行 的标题值 用开始日期填充 A 列 显示我的预期结果比实际编写更容易 非常感谢您的帮助 在A2中尝试复制这个公式 IF COUNTA B
  • 安卓支持所有屏幕尺寸吗?

    我知道这个问题已经被问过很多次了 但我找不到针对我的查询的最佳解决方案 我遵循了android开发者支持中给出的每一个步骤 支持多屏 将不同尺寸的图像放在不同的文件夹中 为设备屏幕制作不同的布局文件夹 但在 4 7 英寸到 5 0 英寸的设
  • JAXB - xsd:all 内具有无限 maxOccurs 的元素

    假设我有以下 java 类 该类映射到 REST 服务的请求主体以搜索用户 XmlRootElement name SearchParams XmlType propOrder public class SearchParams priva
  • 实体框架和自我跟踪实体与 POCO

    如果我想使用实体框架 4 作为我的数据层 并希望将我的实体发送到另一层 无论是通过 WCF 还是其他机制 然后希望能够更新实体并将它们发回以进行更新 删除 插入最好使用自跟踪实体还是 poco 对象 如果可能的话 我宁愿使用 POCO 对象
  • 在 ggplot 中绘制多个时间序列

    我有一个由 10 个变量组成的时间序列数据集 我想创建一个时间序列图 其中每个 10 个变量随着时间的推移以不同的颜色绘制在同一个图表上 值应位于 Y 轴上 日期应位于 X 轴上 点击这里对于数据集 csv 这是我一直在使用的 可能是错误的
  • 如何阅读这个 LESS css?

    我正在尝试找出 Joni Korpi 的 Frameless CSS 无框架网格 http framelessgrid com 并且我很难阅读他拥有的 less 文件 我对 LESS 使用变量有一个基本的了解 所以我知道 column 48
  • 安装 Windows 10 周年更新后无法启动 Android 模拟器

    我刚刚安装了 Windows 10 周年更新 现在无法启动 Android 模拟器 Android Studio 显示以下消息 Android Emulator is incompatible with Hyper V 但如下图所示 Hyp
  • 如何获取大型调查数据集的 svydb R 包以返回标准错误

    很高兴看到 Charco Hui 将 Thomas Lumley 的实验性 sqlsurvey 包复活为 svydb 在 R 中处理大型调查数据集可能是一个很好的工具 不过 在 svydb 计算标准误差时遇到了一些问题 这个问题与我在 sq
  • 尝试找到 4 个点的贝塞尔曲线的长度

    我找到了这个问题的大约 1000 个答案 但没有一个是我可以使用的 因为我在曲线中使用了 4 个控制点 也就是说 我偶然发现了这个人here double BezierArcLength point2d p1 point2d p2 poin
  • 播放案例类的json读取和默认参数?

    我对默认参数和使用 Play Json Read 有问题 这是我的代码 case class Test action String storeResult Option Boolean Some true returndata Option
  • 为 python 函数提供可变数量的参数

    我有一个脚本 它从输入文件中读取可变数量的字段并将它们作为参数传递给函数 例如 文件 1 包含字段 A B 和 C gt function A B C 文件 N 包含字段 A B C 和 D gt function A B C D 我的问题
  • 如何在 django 中使用 @ 提及用户

    我一直在 django 上开发一个项目 它与 instagram 和 twitter 非常相似 它需要具有的功能之一是在文本字段中使用 提及用户 我已经调查了一段时间 关于如何在 django 中做到这一点 除了一些像 django men
  • 如何在 tkinter Entry 小部件中仅插入一些指定的字符

    我有一个包含 n 个 Entry 小部件的列表 用户应该只能键入以下字符 V F 如果用户键入这些字符之一 则焦点应从 Entry x 传递到 Entry x 1 否则焦点应保留在原来的位置 在 Entry x 上 并且应丢弃输入 我无法丢
  • 如何在Java中递归解压文件?

    我有 zip 文件 其中包含一些其他 zip 文件 例如 邮件文件是abc zip它包含xyz zip class1 java class2 java And xyz zip包含文件class3 java and class4 java 所
  • 为第三方 Webflow 重定向 ionic 时要使用什么重定向 URL

    我正在开发一个离子移动应用程序 我想在其中重定向到第三方网络流 该网络流请求用户同意并重定向到回调 URL 我应该指定该回调 URL 以获取令牌作为权限令牌以进行进一步的 API 调用 由于 ionic 本身是一个 html5 移动应用程序
  • 为什么存在NotImplementedException?

    Locked 这个问题及其答案是locked因为这个问题是题外话 但却具有历史意义 目前不接受新的答案或互动 这真的非常让我感到不安 所以我希望有人能给我一个合理的理由来解释为什么事情是这样的 NotImplementedException