У меня есть класс с закрытым полем 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(...);
}
В чем преимущества и недостатки каждого из этих подходов? best practices for handling exceptions говорят, что:
Если событие является действительно исключительным и является ошибкой, используя исключение обработки лучше, потому что меньше кода выполняется в обычном случае ... Если событие происходит регулярно, используя программный метод для проверки на наличие ошибок лучше ...
в моем случае метод GetValue(string userid)
будет вызываться редко, но потенциальные пользователи класса могут использовать его очень часто.