Метод проектирования решения;когда бросить исключение? - PullRequest
0 голосов
/ 26 марта 2012

Предположим, у меня есть метод, который должен возвращать объект (скажем, из уровня базы данных) и принимает в качестве входных данных некоторую информацию о запрошенном объекте.

В обычном случае метод должен возвращать объект. Но что произойдет, если вызывающее лицо не выполнит предварительное условие методов; как я (автор кода метода) должен сообщить об этом вызывающей стороне?

Возьмем, к примеру, случай, когда я должен вернуть информацию о пользователе из БД, а в качестве ввода я использую имя пользователя и пароль. В обычном случае я должен вернуть объект User. Но что, если имя пользователя и пароль будут нулевыми, если они не совпадают, если пароль слишком короткий ... как мне сообщить вызывающему абоненту, в чем именно проблема? Обычно я бы бросил исключение, но здесь - Когда бросать исключение? было предложено, что это плохая идея. Должен ли я поместить поле errorDetail в User или создать метод checkInputData или getErrorStatus ...

Ответы [ 3 ]

1 голос
/ 26 марта 2012

Звучит вполне разумно, если в этом случае выдается исключение.Метод, который должен делать одно и только одно, просто пытается извлечь запись пользователя из базы данных.Если предварительное условие не выполняется, сдавайтесь.Если ошибки базы данных, сдаваться.Если пользователь не найден, сдавайтесь.Пусть вызывающий код справится с последствиями.

Исключением является вполне приемлемый путь выхода для метода.

В случае предварительного условия метод не несет ответственности за исправление этого.Это ответственность вызывающего кода.Так что выведите ArgumentException некоторого вида и позвольте вызывающему коду разобраться с ним.

В случае ошибки базы данных, либо перехватите ее, либо сгенерируйте пользовательское исключение (что-то вроде InfrastructureFailed исключения)приложение для обработки соответственно.В основном, приложение должно сообщить пользователю о технических проблемах и повторить попытку позже.

В случае, если пользователь не найден, это звучит как неудачный вход в систему.Бросьте какой-нибудь SecurityException и позвольте вызывающему приложению обработать его, уведомив пользователя о том, что вход в систему не удался.(Не будьте более конкретны. Например, не говорите пользователю, что имя пользователя было в порядке, но пароль был неверным. Это дает злоумышленнику больше информации, чем вы хотите, чтобы он имел. Просто скажите, что вход не выполнен, ничегоподробнее.)

Вы также упоминаете случай, когда пароль слишком короткий.Я полагаю, что это то, что должно быть проверено, прежде чем он достигнет этой точки.В этом случае это относится к проверке входных данных для метода.Таким образом, предварительные условия не выполняются, и метод даже не пытается добраться до базы данных.Но «пароль слишком короткий», вероятно, не является хорошей ошибкой, чтобы сообщить пользователю при входе в систему.Скорее, это когда они пытаются создать пароль.

Одна вещь, которую вы не должны делать, это возвращать нулевой или пустой пользовательский объект или что-то в этом роде.Это накладывает ответственность на вызывающий код, чтобы проверить, была ли ошибка.Исключения являются совершенно допустимым способом уведомления вызывающего кода об ошибке.Возвращаемый «магический объект» подобен любой другой «магической строке» в коде, но хуже, потому что он вытекает из метода и в другой код.

Теперь это не всегда полное правило,конечно.Это зависит от структуры приложения.Например, если это веб-служба или какой-либо другой тип системы запросов / ответов, вы можете захотеть иметь стандартный объект ответа, который будет указывать на сбой.Это предполагает некоторый прикладной контекст вокруг метода.И в этом случае вы, вероятно, должны по-прежнему иметь дело с несколькими методами.Внутренний (метод доменной логики) будет генерировать исключение, а внешний (метод приложения с поддержкой UX) будет перехватывать исключение и создавать соответствующий ненулевой ответ на пользовательский интерфейс.

Как вы handle исключение зависит от логической структуры вашего приложения.Но выброс и перехвата исключений (имейте в виду, что «перехват» - это не то же самое, что осмысленно «обработка») - вполне приемлемое поведение.

0 голосов
/ 26 марта 2012

Я бы возвратил объект, который содержит как пользователя (ноль в случае ошибки), так и флаг успеха (ложь в случае ошибки) и список строк в качестве сообщений проверки (при ошибке - списокпричины, почему это не удалось).

Добавление поля errorDetail в пользовательский объект не имеет смысла, поскольку на самом деле это не свойство пользовательского объекта.Это только часть этих возвращаемых данных из метода.Этот путь ведет к объектам со свойствами путаницы, которые используются только определенными методами.

0 голосов
/ 26 марта 2012

Имеет ли смысл возвращать какую-то дозорную величину? Если это так, подумайте об этом. Иначе, почему бы не выбросить исключение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...