如果仅部分支持方法参数,则在接口实现中抛出异常

时间:2017-01-15 17:03:21

标签: c# exception interface

我有一个界面,我们用唯一的方法

称它为IOperation
void Operate(TimeSpan time);

我的一个实现是由于硬件限制只能处理4毫秒到1000毫秒之间的整整毫秒。

1)如果有人在时间小于4或大于1000的情况下调用方法,是否应该抛出异常?如果是,是NotSupportedException还是ArgumentOutOfRangeException更好?或者,如果参数不合适,则向上舍入为4或向下舍入为1000。

2)如果时间介于4和1000之间,但TotalMilliseconds属性是小数,那么可以只舍入到完整的毫秒数吗?或抛出异常?

我最喜欢的方法是在两种情况下抛出NotSupportedException,因为根据界面,参数不是无效的,因此ArgumentOutOfRangeException似乎不适合imho。

此外,内部舍入似乎在不通知他的情况下以某种方式取消了呼叫者。另一方面,我对未完全履行接口合同感到不满,调用者应如何对我的NotSupportedExceptions做出反应,因为接口是为了给调用者提供信心,方法是根据合同实现的

3 个答案:

答案 0 :(得分:1)

  1. 如果参数不合适,则向上舍入为4或向下舍入为1000 - 您不应该这样做。您的客户希望他会在一分钟内DELIMITER // CREATE TRIGGER `insertProdCatPathRecord` AFTER INSERT ON `prefix_productcategories` FOR EACH ROW BEGIN DECLARE `path_of_parent` TEXT DEFAULT ''; IF (NEW.`parent` > 0) THEN SELECT `path` INTO `path_of_parent` FROM `prefix_prodcat_path` WHERE `prefix_prodcat_path`.`id`= NEW.`parent`; IF (SELECT FOUND_ROWS()) THEN INSERT INTO `prefix_prodcat_path` VALUES (NEW.`id`,CONCAT(NEW.`parent`,'.',NEW.`id`)); ELSE INSERT INTO `prefix_prodcat_path` VALUES(NEW.`id`,NEW.`parent`); END IF; END IF; END; // DELIMITER ; ,但通过这种方式,他Operate只需要一秒钟。如果你不能达到合同,那么你至少应该clear about that,否则系统可能会出现意外行为。
  2. 如果时间介于4和1000之间,但TotalMilliseconds属性是小数,则可以循环到完整毫秒吗? - 这取决于。同意,对于大多数系统来说,最可能丢失或增加半毫秒的时间对于大多数系统来说并不重要,但另一方面,理论上可以在每个纳秒重要的hard real time system中使用它。
  3. OperateNotSupportedException
    • ArgumentOutOfRangeException - 假设客户端无法检查该参数的有效值是什么,它将违反Liskov Substitution Principle。但是,如果您提供一些其他方法,例如ArgumentOutOfRangeException,则该问题将不适用,因为此类接口假定客户端使用bool IsValid(TimeSpan)检查参数。
    • IsValid - says“当不支持调用的方法时,或者尝试读取,搜索或写入不支持该方法的流时抛出的异常调用功能“。对于因实施限制而无法完成某些特定操作的情况,这似乎是完美的选择。像这样的案件。我只是建议在例外中very specific about the issue(error message)。您甚至可以使用NotSupportedException作为ArgumentOutOfRangeException的{​​{3}}来充分利用这两种异常类型。

答案 1 :(得分:0)

您应该基于硬件系统实现接口隔离原则。

答案 2 :(得分:0)

1)这样的向上或向下舍入很容易导致不可预测的行为。你现在已经熟悉这个副作用了,你甚至可以在方法描述中写一些关于它的信息,但这会降低代码的可读性,将来可能会使用这个代码的人可能会对他提供的论点完全改变感到惊讶。尽量不要在任何时候避免这种副作用。

2)这取决于具体情况,但对于大多数情况来说这样的舍入会很好。必须考虑涉及非常短时间的某些方法的解决方案。请注意,例如.NET

DateTime.Now

具有系统特定的分辨率,通常不低于10毫秒。