Следует ли использовать исключения для описания ошибок ввода пользователя? - PullRequest
0 голосов
/ 29 октября 2018

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

Чтобы сообщить службе, что пошло не так, я использую исключения. Когда метод validateTree () сталкивается с проблемой, он генерирует соответствующее исключение. Затем класс HttpService использует это исключение для формирования соответствующего ответа (например, в ответ на вызов AJAX).

public class HttpService {

    private Service service;
    private Logger logger;

    // ...

    public HttpServiceResponse saveTree(Node root) {
        try {
            service.saveTree(root);  
        } catch (DuplicateNodeException e) {
            return HttpServiceResponse.failure(DUPLICATE_NODE);
        } catch (MissingAbbreviationException e) {
            return HttpServiceResponse.failure(MISSING_ABBREV);
        } catch (MissingNameException e) {
            return HttpServiceResponse.failure(MISSING_NAME);
        } catch (MissingLevelException e) {
            return HttpServiceResponse.failure(MISSING_LEVEL);
        } catch (Exception e) {
            logger.log(e.getMessage(), e. Logger.ERROR);
            return HttpServiceResponse.failure(INTERNAL_SERVER_ERROR);
        }
    }
}

public class Service {

    private TreeDao dao;

    public void saveTree(Node root) 
        throws DuplicateNodeException, MissingAbbreviationException, MissingNameException, MissingLevelException {

        validateTree(root);
        dao.saveTree(root);
    }

    private void validateTree(Node root) 
        throws DuplicateNodeException, MissingAbbreviationException, MissingNameException, MissingLevelException {

        // validate and throw checked exceptions if needed
    }
}

Я хочу знать, это хорошее использование исключений? По сути, я использую их для передачи сообщений об ошибках. В качестве альтернативы мой метод saveTree () должен возвращать целое число, и это целое число будет передавать ошибку. Но для того, чтобы сделать это, я должен был документировать, что означает каждое возвращаемое значение. Кажется, это больше в стиле C / C ++, чем в Java. Является ли мое текущее использование исключений хорошей практикой в ​​Java? Если нет, то какая лучшая альтернатива?

Ответы [ 3 ]

0 голосов
/ 29 октября 2018

Видимый и очень заметный , как с точки зрения самого сообщения, так и с точки зрения того, какой элемент диалогового элемента должен восстанавливать пользователь.

От Гуру Нильсена, https://www.nngroup.com/articles/error-message-guidelines/

0 голосов
/ 29 октября 2018

TL; DR Части на стороне Java, которые вы нам показали, почти идеальны. Но вы можете добавить независимую проверку проверки и использовать ее на стороне клиента, прежде чем пытаться сохранить.

Здесь задействовано много программных слоев, поэтому давайте посмотрим на каждый из них - здесь нет ответа "один размер подходит всем".

  • Для объекта Service это идеальное решение, чтобы он вызывал исключения из метода saveTree(), если не удалось сохранить дерево (по какой-либо причине, не ограничиваясь проверкой). Вот для чего предназначены исключения: сообщать, что какой-то метод не может выполнить свою работу. И объект Service не должен полагаться на какую-либо внешнюю проверку, а должен сам убедиться, что сохраняются только действительные данные.

  • HttpService.saveTree() также должен сообщать вызывающей стороне, если он не может сохранить дерево (обычно указывается исключением из Service). Но так как это HTTP-сервис, он не может генерировать исключения, а должен возвращать код результата и текстовое сообщение, как вы это делаете. Он никогда не может содержать полную информацию об исключении Java, поэтому вы должны регистрировать любые непонятные ошибки здесь (но вы должны убедиться, что трассировка стека также регистрируется!), Прежде чем передать результат ошибки клиенту HTTP .

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

Почему так?

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

  • Реализация проверок проверки в клиентском приложении JavaScript по-прежнему требует той же проверки внутри службы Java (см. Выше), поэтому вам придется поддерживать два фрагмента кода на разных языках, выполняющих одну и ту же бизнес-логику - не повторяйся! Только если дополнительная поездка туда и обратно не допустима, я бы посчитал это приемлемым решением.

0 голосов
/ 29 октября 2018

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

Вместо этого создайте список и внесите в него ошибки. Затем вы можете показать пользователю список всех ошибок проверки.

Ожидание, пока ваш запрос не получил весь путь к DAO кажется, неподходящее время, чтобы сделать эту проверку. Контроллер передней стороне сервера должен делать проверку по этим пунктам, прежде чем они прошли вместе дальше, как защита от атак, таких как инъекции или межсайтовый скриптинг.

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