... ломает m [y] ООП цель пользователя, которому не нужно знать о базовых объектах.
Бросок того же исключения ничего не делает для инкапсуляции. В вашем договоре (подразумеваемом / задокументированном - поскольку у нас нет проверенных исключений или DbC) указано, что в этом случае вы выбросите исключение ArgumentOutOfRange
или нет. Как генерируется это исключение и как выглядит его трассировка стека, не имеет значения для вызывающей стороны.
Если вы переместите свою внутреннюю реализацию к чему-то, что не выдает исключение ArgumentOutOfRange, тогда вам нужно будет сгенерировать ее самостоятельно для выполнения вашего контракта (или внесения критических изменений в контракт).
Трассировка стека (и имя параметра) предназначена для отладки парня, а не для программного доступа. Если не возникает проблем с безопасностью, не стоит беспокоиться о том, чтобы позволить им «просочиться».
Кстати, совет (о котором вы, возможно, думаете) об обертывании исключений исходит из более абстрактного сценария. Рассмотрим IAuthenticationService
, который выбрасывает, если пользователь не может Login
,
Если есть реализации LdapAuthenticationService
и DatabaseAuthenticationService
, то вам нужно будет отловить и LdapDirectoryException
, и SqlException
, чтобы определить неудачный вход в систему. Когда 3-я реализация будет завершена, вам нужно будет добавить также ее конкретные типы исключений. Всем реализаторам, заключившим свое конкретное исключение в FailedAuthenticationException
, вам нужно беспокоиться только об одном типе.
Хотя было бы неплохо включить исходное исключение в InnerException
, поскольку оно помогает в отладке.
Я надеюсь, что вы видите разницу между этим сценарием и вашим - в вашем случае вы просто выбрасываете тот же тип исключения, поэтому нет никакой разницы.
Все это, как говорится, если бы это было для библиотеки - тогда я бы проверил это и бросил. Но не для чистоты ООП, а потому, что это делает контракт явным и с меньшей вероятностью непреднамеренного изменения. Если бы я использовал [T | B] DD, то я просто написал бы для него тест и позволил бы вместо него List
throw - тест делает контракт явным.