从合同例外中删除语法

时间:2015-11-24 22:29:59

标签: .net code-contracts

违反以下合同时:

Contract.Requires<CustomException>(arg1 != null, "arg1 cannot be null");

CustomException.Message中的消息变为:前提条件失败:arg1!= null arg1不能为空。在这种情况下,如何防止代码合同将“前提条件失败:arg1!= null ”添加到CustomException.Message

我的程序集正在使用代码契约的“标准契约需求”模式(code contract's user manual的第5.1节中的用法2)因为我想在发布版本中使用合同进行公共方法的参数验证,因此我' m使用Contract.Requires<T>(带有type参数)。在这种情况下,我似乎无法访问我的“arg1不能为空”消息。我不想尝试删除“Precondition failed etc.”使用字符串操作。

我知道如果我改为抛出ContractException(使用非通用Contract.Requires),我可以使用反射从ContractException.UserMessage获取我的消息。但是我不相信这些合同在使用“标准合同要求”模式时会起作用,而且无论如何我都无法全局发现这些错误。

1 个答案:

答案 0 :(得分:2)

Code Contracts User Manual(第5.1.2节,第21页)暗示这是预期的行为:

  

RequiresExn(...)旨在与工具支持一起使用,意思是   它们在所有构建中继承,消息字符串是   自动生成以包含失败的条件

它没有提到要覆盖自动生成的消息,所以我认为不能。但是,作为解决方法,可以创建自定义合约运行时类(请参阅第7节,特别是用户手册的第7.7节),它会重写Requires<Ex>,以便根据需要设置Exception.Message。 / p>