Оба подхода верны. Это означает, что контракт должен быть написан таким образом, чтобы указать для всех случаев, которые не являются действительно исключительными, поведение, которое не требует создания исключения.
Обратите внимание, что некоторые ситуации могут быть или не быть исключительными в зависимости от того, что ожидает вызывающий код. Если вызывающая сторона ожидает, что словарь будет содержать определенный элемент, и отсутствие этого элемента будет указывать на серьезную проблему, то невозможность найти этот элемент является исключительным условием и должна вызвать исключение. Однако, если вызывающая сторона на самом деле не знает, существует ли элемент, и в равной степени готова обработать его присутствие или его отсутствие, то отсутствие элемента будет ожидаемым условием и не должно вызывать исключения. Лучший способ справиться с такими изменениями в ожидании вызывающего абонента - это указать в контракте два метода: метод DoSomething и метод TryDoSomething, например
TValue GetValue(TKey Key);
bool TryGetValue(TKey Key, ref TValue value);
Обратите внимание, что хотя стандартный шаблон 'try' такой же, как показано выше, некоторые альтернативы также могут быть полезны, если вы разрабатываете интерфейс, который производит элементы:
// In case of failure, set ok false and return default<TValue>.
TValue TryGetResult(ref bool ok, TParam param);
// In case of failure, indicate particular problem in GetKeyErrorInfo
// and return default<TValue>.
TValue TryGetResult(ref GetKeyErrorInfo errorInfo, ref TParam param);
Обратите внимание, что использование чего-то вроде обычного шаблона TryGetResult в интерфейсе сделает интерфейс инвариантным относительно типа результата; использование одного из шаблонов выше позволит интерфейсу быть ковариантным по отношению к типу результата. Кроме того, это позволит использовать результат в объявлении 'var':
var myThingResult = myThing.TryGetSomeValue(ref ok, whatever);
if (ok) { do_whatever }
Не совсем стандартный подход, но в некоторых случаях преимущества могут его оправдать.