Использование исключения для чего-то подобного является плохой идеей.
Исключения предназначены для исключительных вещей, а именно вещей, которые вы не можете контролировать в своем коде, таких как сетевые ошибки и нарушения разрешений ввода / вывода.
Этот видвещь - это то, что Эрик Липперт назвал бы досадным исключением :
Исключения являются результатом неудачных дизайнерских решений.Vexing исключения генерируются в совершенно не исключительных обстоятельствах, и поэтому должны быть пойманы и обрабатываться все время.
Классическим примером неприятного исключения является Int32.Parse
, который выдает, если вы дадите ему строку, котораяне может быть проанализирован как целое числоНо 99% сценария использования этого метода - преобразование строк, вводимых пользователем, что может быть любой старой вещью, и, следовательно, это ни в коем случае не является исключительным случаем синтаксического анализа.Хуже того, у вызывающего абонента нет возможности заранее определить, является ли его аргумент плохим, без реализации всего метода самостоятельно, и в этом случае ему не нужно будет вызывать его в первую очередь.
Этонеудачное решение о дизайне было настолько досадным, что, конечно, вскоре после этого команда разработчиков фреймворков реализовала TryParse
, что делает правильную вещь.
Если MappedDetails
является ссылочным типом, лучше вернуть null
, если этоне найден.
Если это тип значения, измените ваш метод на возвращение MovieDetails?
и верните null
.
Я бы также рекомендовал изменить имя вашего метода с FindSingle
на GetMovieDetails
или что-то в этом роде.
Таким образом, когда вы посмотрите на код через 6 месяцев и увидите что-то вроде этого:
....
var details = GetMovieDetails(id);
....
Вы можете мгновенно узнать, что на самом деле делает метод, в отличие от
....
var details = FindSingle(id);
....
, что в принципе вам ничего не говорит.