У меня есть класс с частным полем Dictionary<string, T>
(users
), где ключ string
представляет имя пользователя. Я написал несколько методов для этого класса, например, метод GetValue(string userid)
возвращает объект T
, связанный с указанным именем пользователя.
Я бы обработал исключения, которые могут возникнуть в этом классе и вызваны словарем. Например:
- если указанный ключ равен нулю,
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)
будет вызываться редко, но потенциальные пользователи класса могут использовать его очень часто.