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