更好的编写异常的方法 - java

时间:2016-09-26 05:26:55

标签: java exception-handling java-8

我正在审查一位开发人员编写的以下代码。我不是一个java专家,但恕我直言,我觉得这不是有效使用例外 - 我觉得这样的原因是:

  • 以下代码抛出异常 - 似乎是流量控制。由于我们只是使用它,所以在PageErrorRequestAttrUtil类中添加一个属性错误属性 - 使用方法可以更好地完成此操作,而不是为了可读性而抛出异常。
  • 下面的代码并没有真正定义一个API,它实际上会引发异常,通知调用者出错了。

我想要第二个意见,以确保我解释错误。

下面的第一个类在AEM / Sightly [1]的上下文中调用,并返回前端代码的java支持对象。在此示例中,类正在检查AEM页面是否设置了某些属性,第二类是否适合请求,并用于向页面的用户/作者显示有用的消息。

[1] https://docs.adobe.com/content/docs/en/aem/6-1/ref/javadoc/com/adobe/cq/sightly/WCMUsePojo.html

第1课

    public class HrefLangUtil extends WCMUsePojo {
        private static final Logger log = LoggerFactory.getLogger(HrefLangUtil.class);

        private String hrefLangMultiLine;
        private List<Map> hrefLangMapList;
        private String err;

        final private String COMMA = ",";
        final private String NEW_LINE = "\\n";
        final private static String validUrlCharRegex = "[\\w\\Q!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~\\E]+";
        final private String ERROR_MESSAGE = "The following authored hreflang path and code value pair is invalid: ";
        final private String HREF_LANG_MULTI_LINE = "hrefLangMultiLine";
        final private String HREF_LANG_ERROR_MESSAGE = "hrefLangErrorMessage";
        final private String HREF_LANG_PATH = "hrefLangPath";
        final private String HREF_LANG_CODE = "hrefLangCode";

        @Override
        @SuppressWarnings("unchecked")
        public void activate() throws Exception {
            ValueMap pageProperties = getPageProperties();
            hrefLangMultiLine = pageProperties.get(HREF_LANG_MULTI_LINE, StringUtils.EMPTY);
            if(!hrefLangMultiLine.isEmpty()){
                String[] hrefLangLine = hrefLangMultiLine.split(NEW_LINE);
                hrefLangMapList = new ArrayList<>();

                try{
                    for (String hrefLang : hrefLangLine ){
                        if(!hrefLang.contains(COMMA) || hrefLang.split(COMMA).length > 2 || !hrefLang.matches(validUrlCharRegex)){
                            throw new Exception(ERROR_MESSAGE + hrefLang);
                        }
                        Map<String, String> hrefLangMap = new HashMap<>();
                        hrefLangMap.put(HREF_LANG_PATH, hrefLang.split(COMMA)[0]);
                        hrefLangMap.put(HREF_LANG_CODE, hrefLang.split(COMMA)[1]);
                        hrefLangMapList.add(hrefLangMap);
                    }
                }catch (Exception e){
                    err = e.getMessage();
                    log.error(err);
                    SlingHttpServletRequest request = getRequest();
                    RequestAttr requestAttr = new RequestAttr(request);
                    PageErrorRequestAttrUtil.putPageErrorAttr(HREF_LANG_ERROR_MESSAGE, err, requestAttr);
                }
            }
        }

        public List<Map> getHrefLangMapList() {
            return hrefLangMapList;
        }

        public String getErr() {
            return err;
        }
    }

2。 Class2

            public class PageErrorRequestAttrUtil{
                  static String PAGE_LEVEL_ERROR_MESSAGES = "pageLevelErrorMessages";
                  private static final Logger log = LoggerFactory.getLogger(PageErrorRequestAttrUtil.class);

                /**
                 * @param key The key which describes the origin of the error or alert
                 * @param value The actual error message which will be displayed at the top of the page. Should be passed as a {@link String}.
                 * @param requestAttr The object representation {@link RequestAttr} of the the current request
                 * @return String
                 */
                @SuppressWarnings("unchecked")
                public static Object putPageErrorAttr(String key, Object value, RequestAttr requestAttr){
                    try{
                        Map<Object, Object> pageLevelErrorMessages;
                        if(!requestAttr.containsKey(key)){
                            pageLevelErrorMessages = new HashMap<>();
                            pageLevelErrorMessages.put(key, value);
                            requestAttr.put(PAGE_LEVEL_ERROR_MESSAGES, pageLevelErrorMessages);
                        }else{
                            if(requestAttr.get(PAGE_LEVEL_ERROR_MESSAGES) instanceof Map){
                                pageLevelErrorMessages = (Map) requestAttr.get(PAGE_LEVEL_ERROR_MESSAGES);
                                pageLevelErrorMessages.put(key, value);
                                requestAttr.put(key, pageLevelErrorMessages);
                            } else{
                                throw new Exception();
                            }
                        }
                    }catch(Exception e){
                        log.error("The expected pageLevelErrorMessages Map is a reserved key for error messages, it is not of the expected type, Map<>");
                    }
                    return value;
                }
        }

请建议

1 个答案:

答案 0 :(得分:0)

codereview.stackexchange.com会是一个更好的地方。

回答你的问题,

  

下面的代码并没有真正定义一个API,实际上它会抛出异常,通知调用者出错了。

activate作为一种方法应该执行一些操作,并且当它不能时它会抛出异常。如果方法为canActivate

,那将是一个不同的故事
  

以下代码抛出异常 - 看起来像流量控制。由于我们刚刚使用它,因此在PageErrorRequestAttrUtil类中添加了一个属性错误属性 - 使用方法可以更好地完成此操作,而不是为了提高可读性而抛出异常。

同意你的意见。上面的代码可以用简单的if...else

替换