void ReadContent(string path)
{
Contract.Requires(path!=null);
string contentofileasstring = filehelperobj.GetContent(path);
if(String.IsNullOrEmpty(contentofileasstring ))
{
throw new FileContentException(path + "No content found");
}
m_xmlobj = contentofileasstring ;
}
在这种情况下,我是否正确使用代码合同和例外。您是否认为用代码合同替换异常是合乎逻辑的(反之亦然)?
代码未经过测试。只是一个示例场景
答案 0 :(得分:1)
假设你的行是错误的(即在尝试使用它之前测试null 的路径)那么是的,它是一个有效的前置条件因此应该是一个代码合同。
答案 1 :(得分:1)
我可能会选择如下所示的实现:
private void ReadContent(string path)
{
Contract.Requires<FileMissingException>(File.Exists(path));
string content = filehelperobj.GetContent(path);
m_xmlobj = content;
}
发布修改
由于这是您要验证的内容,我会在Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()));
方法中添加filehelperobj.GetContent(string)
。然后,如果正在读取的内容为null或为空,我会抛出异常。 e.g。
public string GetContent(string path)
{
Contract.Requires<FileMissingException>(File.Exists(path));
Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()));
using(var reader = new StreamReader(File.OpenRead(path)))
{
var content = reader.ReadToEnd();
if(String.IsNullOrEmpty(content))
throw new FileContentException("No content found at file: " + path);
return content;
}
}