Зависит от того, как настроена ваша логика. Если ваша логика чтения файлов является универсальной (не универсальной в C #, а универсальной в том смысле, что она не специфична), то было бы лучше поместить исключение в значение чуть выше.
Например, если так было настроено:
// just an example
FileContents ReadFile(string path)
{
// Don't necessarily throw exceptions related to data validity
}
SomeObject FromFile(string path)
{
FileContents contents = ReadFile(path);
// Do throw exceptions related to data validity
// construct your object
}
Все сводится к тому, что имеет смысл, где проводить проверку. Как правило, вы должны генерировать исключения только в исключительных ситуациях (ситуациях, когда вы не можете восстановиться на этом конкретном уровне). Некоторые методы, находящиеся выше в стеке вызовов, могут знать, что делать в этой ситуации.
Кроме того, если вы должны генерировать множество различных типов исключений, в качестве вежливости к вызывающим сторонам ваших методов (косвенным или прямым, вам или другим разработчикам) было бы хорошей идеей, чтобы ваши исключения имели общую основу исключение (отличное от System.Exception
), поэтому его можно перехватить с помощью всего лишь нескольких операторов catch
.
Пример иерархии наследования может быть:
- System.Exception
- DataLoadException
- NameException
- NameTooLongException
- InvalidNameException
- AgeException
- ...
Таким образом, если вызывающая сторона хочет знать только, успешен ли метод, ему нужно будет только поймать DataLoadException
вместо того, чтобы перехватывать все типы бросаемых исключений. Если звонящий вместо этого хочет точно знать, что пошло не так, он может сделать это также.