代码约定使用,但有例外

本文关键字:约定 代码 | 更新日期: 2023-09-27 18:32:41

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

在这种情况下,我对代码契约和异常的使用假设是正确的。您认为用代码协定替换异常是否合乎逻辑(反之亦然)?

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

代码约定使用,但有例外

我可能会选择如下所示的实现:

private void ReadContent(string path)
{
    Contract.Requires<FileMissingException>(File.Exists(path));
    string content = filehelperobj.GetContent(path);
    m_xmlobj = content;
}

帖子编辑

由于这是您要验证的内容,因此我会在filehelperobj.GetContent(string)方法中放入一个Contract.Ensures(!String.IsNullOrEmpty(Contract.Result<string>()));。然后,如果正在读取的内容为 null 或为空,我将抛出异常。例如

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

好吧,假设你的行是错误的(即,在尝试使用它之前测试路径的null),那么是的,这是一个有效的先决条件,因此应该是一个代码契约。