У меня есть класс с приватным полем Dictionary<string, T>
(users
), где ключ string
представляет имя пользователя. Я написал несколько методов для этого класса, например, метод GetValue(string userid)
возвращает объект T
, который связан с указанным именем пользователя.
Я бы обработал исключения, которые могут возникнуть в этом классе и которые вызваны словарем. Например:
- если указанный ключ имеет значение null,
Dictionary
выдает ArgumentNullException
;
- если указанный ключ не существует в
Dictionary
, он выдает KeyNotFoundException
.
Первый подход мог бы заключаться в том, чтобы перехватывать исключения, выдаваемые Dictionary
, и повторно генерировать те же исключения или создавать пользовательские исключения.
public T GetValue(string userid)
{
try
{
return users[userid];
}
catch(ArgumentNullException ex1)
{
// re-throw the same exception
}
catch(KeyNotFoundException ex2)
{
throw new UserIdNotFoundException("The specified userid does not exist.", ex2); // custom exception
}
}
Второй подход может заключаться в том, чтобы избежать перехвата исключений, но проверить условия, которые их вызывают, и выдать соответствующие исключения.
public T GetValue(string userid)
{
if (userid != null)
{
if(users.ContainsKey(userid))
return users[userid];
else throw new UserIdNotFoundException("The specified userid does not exist.", ex2); // custom exception
}
else throw new ArgumentNullException(...);
}
Третий подход аналогичен второму, но он использует TryGetValue
метод Dictionary
.
public T GetValue(string userid)
{
if (userid != null)
{
T value;
if(users.TryGetValue(userid, out value))
return value;
else throw new UserIdNotFoundException("The specified userid does not exist.", ex2); // custom exception
}
else throw new ArgumentNullException(...);
}
Каковы преимущества и недостатки каждого из этих подходов?
рекомендации по обработке исключений говорят, что:
Если событие действительно исключительное и является ошибкой, используется исключение
обработка лучше, потому что в нормальном случае выполняется меньше кода ...
Если событие происходит регулярно, используя программный метод для проверки
за ошибки лучше ...
В моем случае метод GetValue(string userid)
будет вызываться редко, но потенциальные пользователи класса могут использовать его очень часто.