Критическая проблема Sonarqube «Определите и создайте специальное исключение вместо использования общего»

#java #java-11

Вопрос:

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

когда я удаляю «Исключение» и упоминаю выделенное исключение(исключение IOException, исключение SAXException, исключение ParserConfigurationException). В то время сонар поднимал серьезную проблему «используйте универсальный».

 public Element createDomElement(String xmlRequest) throws Exception {
        DocumentBuilder documentBuilder;
        Document document = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance();
        dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        dbf.setNamespaceAware(true);
        documentBuilder = dbf.newDocumentBuilder();

        if (documentBuilder == null) {
            throw new ABCException(null, "unexpected_error", "Error processing request", null,
                    INTERNAL_SERVER_ERROR);
        }

        synchronized (this) {
            document = documentBuilder.parse(new ByteArrayInputStream(xmlRequest.getBytes(UTF_8)));
        }
        document.getDocumentElement().normalize();
        return document.getDocumentElement();
    }
 

Не уверен, как я могу решить, не могли бы вы, пожалуйста, кто-нибудь, помочь мне с этим.

Ответ №1:

Это потому, что в бросках отсутствует исключение ABCException? Не могли бы вы, пожалуйста, попробовать нижеприведенную подпись метода и запустить sonarqube?

 public Element createDomElement(String xmlRequest) throws ParserConfigurationException, ABCException, SAXException, IOException {}
 

Правка 1
Подходы к решению этой проблемы

  1. Бросьте только исключение ABCException из метода createDomElement (). Обрабатывайте исключения rest в самом createDomElement (). Не уверен, что его рекомендовали.
 public Element createDomElement(String xmlRequest) throws ABCException {
        DocumentBuilder documentBuilder;
        Document document = null;
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance();
        try {
            dbf.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);
        } catch (ParserConfigurationException e) {
            throw new ABCException(null, "Parser Error", "Error processing request", null,
                    "Parser Error : "   e.getMessage());
        }
//todo remaining part of method
}
 
  1. Рефакторинг кода и разделите метод createDomElement (), чтобы следовать единой ответственности. Этот подход выглядит лучше, чем первый. Проверьте этот ответ https://softwareengineering.stackexchange.com/a/264068

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

1. Все еще получаю сообщение Рефакторинг этого метода, чтобы создать не более одного проверенного исключения вместо: исключение javax.xml.parsers.ParserConfigurationException, исключение org.xml.sax.SAXException, исключение java.io.IOException

2. Обновил свой ответ с возможными подходами