Страницы

Поиск по вопросам

понедельник, 19 ноября 2018 г.

Уместность использования исключений

Здравствуйте. Никогда не пользовался исключениями, но теперь решил прояснить для себя эту тему. Мне оказалось приятным использование исключений, но тут-же я увидел предостережение против этого. Представим себе случай, когда у нас есть метод например регистрация пользователя. Этот метод скрывает в себе все сложности регистрации, например проверка свободности логина и имейла. В случае если у логин занят, должно выводится сообщение, то же с имейлом. Сам метод вызывается из контроллера asp.net. public void RegisterUser(SignUpModel registerData) {
if(!UserData.UserEmailIsFree(registerData.Email)) {
throw new EmailIsNotFreeException();
}
if(!UserData.UserLoginIsFree(registerData.Login)) {
throw new LoginIsNotFreeException();
}
User newUser = new User();
newUser.Login = registerData.Login; newUser.Password = registerData.Password; newUser.Email = registerData.Email;
UserData.AddUser(newUser);
} Это как бы мог выглядеть код с исключениями. Я так понимаю это плохой подход, но он чертовски удобен. В другом случае следует применить коды возврата, насколько я понимаю. Получается замкнутый круг. Объясните мне, как следует поступать? Мне нужны авторитетные источники, примеры кода, изящные решения и все, что можете помочь мне. Понимаю, что в интернете множество холиваров по этому поводу, но нигде не сказано, каким путем можно идти без использования исключений. Много людей говорит, что исключения повсеместно это плохо, но как тогда быть. Буду рад каждому болеее-менее полезному ответу. Спасибо!


Ответ

Вкратце, я могу посоветовать установить соглашения для всего проекта о том, как будут обрабатываться ошибки, будут ли они обозначаться кодами возврата или исключениями, и следовать этому соглашению единообразно, тогда вы не запутаетесь при сопровождении. Стоит, правда, заметить, что исключительные ситуации должны использоваться действительно в исключительных случаях (в идеале, они должны использоваться для событий, которые очень редки, либо никогда не должны наступать), ибо они как минимум нарушают инкапсуляцию: нельзя просто так увидеть, какие исключения может "выкинуть" вызываемый код. Кроме того, их придётся обработать, ибо иначе код упадёт. Короче, их использование повышает сложность кода. Кстати, посмотрите на метод bool Dictionary.TryGetValue(TKey key, out TValue value) - хороший пример из самой среды дотнет, как можно обойтись без исключений. Наконец, советую почитать С. Макконнелла "Совершенный код", часть II, глава 8 "Защитное программирование" - внятно и аргументированно объясняются как раз таки заданные вопросы. А ещё лучше, всю книгу. :)

Комментариев нет:

Отправить комментарий