从合同例外中删除语法
Remove syntax from contract exceptions
当违反以下约定时:
Contract.Requires<CustomException>(arg1 != null, "arg1 cannot be null");
CustomException.Message
中的消息变为:前提条件失败:arg1 != null arg1 不能为 null。在这种情况下,如何防止代码合同将“Precondition failed: arg1 != null”添加到 CustomException.Message
?
我的程序集正在使用代码契约的 "standard contract requires" 模式(code contract's user manual 第 5.1 节中的用法 2),因为我想在发布版本中使用契约对 public 方法进行参数验证,因此我使用 Contract.Requires<T>
(带有类型参数)的原因。在这种情况下,我似乎无法单独访问我的 "arg1 cannot be null" 消息。我不想尝试使用字符串操作来删除 "Precondition failed etc."。
我知道如果我改为抛出 ContractException
(使用非泛型 Contract.Requires
),我可以使用反射从 ContractException.UserMessage
获取消息。但我不相信这些合同在使用 "standard contract requires" 模式时会起作用,而且无论如何我都无法全局捕获这些错误。
Code Contracts User Manual(第 5.1.2 节第 21 页)暗示这是预期的行为:
RequiresExn(...) is intended to be used with tool support, meaning
that they are inherited in all builds and the message strings are
generated automatically to include the failing condition
它没有提到要覆盖自动生成的消息,所以我认为不能。但是,作为一种变通方法,可以创建一个自定义合约运行时 class(请参阅第 7 节,特别是用户手册的第 7.7 节)重写 Requires<Ex>
以便它设置 Exception.Message
根据需要。
当违反以下约定时:
Contract.Requires<CustomException>(arg1 != null, "arg1 cannot be null");
CustomException.Message
中的消息变为:前提条件失败:arg1 != null arg1 不能为 null。在这种情况下,如何防止代码合同将“Precondition failed: arg1 != null”添加到 CustomException.Message
?
我的程序集正在使用代码契约的 "standard contract requires" 模式(code contract's user manual 第 5.1 节中的用法 2),因为我想在发布版本中使用契约对 public 方法进行参数验证,因此我使用 Contract.Requires<T>
(带有类型参数)的原因。在这种情况下,我似乎无法单独访问我的 "arg1 cannot be null" 消息。我不想尝试使用字符串操作来删除 "Precondition failed etc."。
我知道如果我改为抛出 ContractException
(使用非泛型 Contract.Requires
),我可以使用反射从 ContractException.UserMessage
获取消息。但我不相信这些合同在使用 "standard contract requires" 模式时会起作用,而且无论如何我都无法全局捕获这些错误。
Code Contracts User Manual(第 5.1.2 节第 21 页)暗示这是预期的行为:
RequiresExn(...) is intended to be used with tool support, meaning that they are inherited in all builds and the message strings are generated automatically to include the failing condition
它没有提到要覆盖自动生成的消息,所以我认为不能。但是,作为一种变通方法,可以创建一个自定义合约运行时 class(请参阅第 7 节,特别是用户手册的第 7.7 节)重写 Requires<Ex>
以便它设置 Exception.Message
根据需要。