How to signal “not implemented yet”?
在新gem的初始起草过程中,我需要将一些方法实现留空(将在下一个过程中实现)
因此,我想表示一个"尚未实现"的异常
我想知道对于Ruby语言是否有一个特定的最佳实践或标准约定来编码这种占位符/异常。
例如:
- Java中的未支持操作异常
- 不在.NET框架中实现异常(C)
- 澄清:在这个预发布阶段,我们需要一种方法来保留一个占位符(即,我们希望定义方法:它将在我们正在编写的类的self.methods中),但在具体实现之前,我们需要测试失败和一个易于理解的跟踪。
您应该引发NotImplementederRor
1
| raise NotImplementedError |
红宝石博士
- 请记住,根据2.3.0文档,不打算使用implementederror,但它表示feature is not implemented on the current platform。它还有一个不寻常的继承链ScriptError > Exception,其中大部分的例外继承自StandardError。你可能会制造自己的错误来表明这一点,并从StandardError继承它,这可能会更好。
- @Ivankolmychek在feature is not implemented yet on current platform的情况下应该使用什么异常类?
- 我看到的实现这一点的最佳方法是创建将继承StandardError的自定义异常类,这样,如果需要,可以正确地捕获它。这就是为什么捕获其他东西(如SyntaxError,NotImplementedError是从2.3.0继承的)可能是一个坏主意:stackoverflow.com/questions/10048173/…
- 以下是原始答案(现已删除)所说的内容。我觉得这上面有一些额外的颜色,因为某种原因,现在已经不见了。imgur.com/a/fsbvm公司
你可以用今天的宝石
有一个文档和一些示例。
它不实现异常,而是一个日志记录机制和临时解决方案的可能性。
- +1这个解决方案可能对我的案件很有意思。
- @Francorondini I发布了一个新版本(相同的功能,但另一个文件结构和改进的文档)
看起来原来的答案,建议提高NotImplementedError被删除了。我将尝试一下:写文档。
不要添加仅仅是占位符的代码。您不想让人们使用该API进行编码,因此甚至不给他们机会(包括您自己)。相反,在课程和/或自述中记录您当前计划使用的路线图。那就改变一下吧。当你着手解决路线图中的任何问题时,你很可能会对什么是合适的解决方案有新的想法。我认为这在任何语言/框架中都是正确的做法,但我认为Ruby特别鼓励我们不要编写您不打算执行的代码。
- 尽管这解决了OP的问题,但有一个相关的问题,即记录子类所需的方法。虽然duck类型不鼓励在父类中定义(因此也不鼓励使用docs),但在有多个团队成员的项目或将要移交给第三方的项目(例如api合同)中,这是不可维护的。
不要在文档中提及未实现的方法,也不要提及它们尚未实现。仅此而已。
- 这是对文档的好建议,但我在问题中的意思是针对@padde给出的答案中的一种例外情况。
- 使用未实现的方法时会出现问题。如果不知道这种方法的存在,那么这种问题就不会首先出现。而没有记录就足以掩盖存在。如果您认为用户已经足够黑客化,可以通过查看源代码来找出这种方法,那么您可以简单地在源代码中的该方法中编写#TODO,通知它尚未实现。
- #TODO注释是一个很好的实践,我当然会遵循;在其他开发中,还有IDE(CFR)。eclipse)利用这种特殊的注释向开发人员报告警告;我已经习惯了这样做。顺便说一句,我想更好地解释一下我的问题:在最初的起草阶段,我指的是一个发布前阶段,在这个阶段,用户和开发人员是相同的,我们需要一种方法来留下一个占位符(即方法将在class.methods中,但如果在最后不进行实现,则会很容易并且立即导致带有track的测试失败。无可挑剔的
在调用一个不存在的方法时,Ruby无论如何都会为您提升一个NoMethodError。对于大多数情况来说,这应该足够好了。
- 虽然这样做可能有效,但它也会向gem/api的用户发送错误的消息——某个地方有一个bug,或者某些代码试图调用错误的方法。在您的示例中,代码正在调用正确的方法,但该方法应该单独实现。我建议用江户一号〔1〕代替。
- 我同意Sudhir的观点。我还没有足够的代表投反对票,但是Ruby文档说NoMethodRor用于未定义的方法。然而,在本例中,您有一个定义的方法,没有实现,这使得nomethodError具有欺骗性。
- @约西亚,我也同意@sudhirjonathan。我在编写抽象类时使用notimplementederror,但是我倾向于添加一条解释错误的消息,例如:raise NotImplementedError, new("#{self.class.name} is an abstract class.")。我在books.google.com.au/…中发现了这种方法。