代码与异常合同使用

时间:2012-04-27 15:51:34

标签: c# exception-handling

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 ;
}

在这种情况下,我是否正确使用代码合同和例外。您是否认为用代码合同替换异常是合乎逻辑的(反之亦然)?

代码未经过测试。只是一个示例场景

2 个答案:

答案 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;
    }
}