Использование контрактов кода с исключениями

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 ответа

Решение

Я бы, наверное, пошел на реализацию, которая выглядит следующим образом:

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) метод. Тогда, если читаемый контент был нулевым или пустым, я бы выдал исключение. например

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), тогда да, это допустимое предварительное условие и, следовательно, должно быть контрактом кода.

Другие вопросы по тегам