编写异常的更好方法-java

编写异常的更好方法-java,java,exception-handling,java-8,Java,Exception Handling,Java 8,我正在审阅一位同事编写的以下代码。我不是java专家,但我不认为这是对异常的有效使用——我觉得这样做的原因是: 下面的代码引发异常-看起来像流控制。因为我们只是在使用它,所以在PageErrorRequestAttrUtil类中添加一个属性error属性-为了可读性,最好使用一个方法而不是抛出一个异常 下面的代码并不是真正定义一个API,它实际上应该抛出异常,通知调用方出了问题 我需要第二种意见,以确保我对这一点的解释是错误的 下面的第一个类在AEM/Sightly[1]的上下文中调用,并为

我正在审阅一位同事编写的以下代码。我不是java专家,但我不认为这是对异常的有效使用——我觉得这样做的原因是:

  • 下面的代码引发异常-看起来像流控制。因为我们只是在使用它,所以在PageErrorRequestAttrUtil类中添加一个属性error属性-为了可读性,最好使用一个方法而不是抛出一个异常
  • 下面的代码并不是真正定义一个API,它实际上应该抛出异常,通知调用方出了问题
我需要第二种意见,以确保我对这一点的解释是错误的

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

[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;
        }
    }
public类HrefLangUtil扩展了WCMUsePojo{
私有静态最终记录器log=LoggerFactory.getLogger(HrefLangUtil.class);
私有字符串HREG多行;
私人名单;
私有字符串错误;
最后一个私有字符串逗号=“,”;
最后一个私有字符串NEW_LINE=“\\n”;
最后一个私有静态字符串validUrlCharRegex=“[\\w\\Q!\”\$%&'()*+,-./:;?@[\]^ `{124;}~\\ E]+;
final private String ERROR_MESSAGE=“以下编写的hreflang路径和代码值对无效:”;
最后一个私有字符串HREF\u LANG\u MULTI\u LINE=“hrefLangMultiLine”;
最后一个私有字符串HREF\u LANG\u ERROR\u MESSAGE=“hrefLangErrorMessage”;
最后一个私有字符串HREF_LANG_PATH=“hrefLangPath”;
最后一个私有字符串HREF_LANG_CODE=“hrefLangCode”;
@凌驾
@抑制警告(“未选中”)
public void activate()引发异常{
ValueMap pageProperties=getPageProperties();
hrefLangMultiLine=pageProperties.get(HREF\u LANG\u MULTI\u LINE,StringUtils.EMPTY);
如果(!hrefLangMultiLine.isEmpty()){
字符串[]hrefLangLine=hrefLangMultiLine.split(新行);
hrefLangMapList=新的ArrayList();
试一试{
用于(字符串hrefLang:hrefLangLine){
如果(!hrefLang.contains(逗号)| hrefLang.split(逗号).length>2 | |!hrefLang.matches(validulcharregex)){
抛出新异常(错误消息+hrefLang);
}
Map hrefLangMap=newhashmap();
hrefLangMap.put(HREF_LANG_PATH,hrefLang.split(逗号)[0]);
hrefLangMap.put(HREF_LANG_代码,hrefLang.split(逗号)[1]);
hrefLangMapList.add(hrefLangMap);
}
}捕获(例外e){
err=e.getMessage();
日志错误(err);
SlingHttpServletRequest=getRequest();
RequestAttr RequestAttr=新的RequestAttr(请求);
PageErrorRequestAttrUtil.putPageErrorAttr(HREF_LANG_ERROR_MESSAGE,err,requestAttr);
}
}
}
公共列表getHrefLangMapList(){
返回hregramplist;
}
公共字符串getErr(){
返回错误;
}
}
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;
                }
        }
公共类PageErrorRequestAttrUtil{
静态字符串PAGE\u LEVEL\u ERROR\u MESSAGES=“pageLevelErrorMessages”;
私有静态最终记录器log=LoggerFactory.getLogger(PageErrorRequestAttrUtil.class);
/**
*@param key描述错误或警报来源的键
*@param value将显示在页面顶部的实际错误消息。应作为{@link String}传递。
*@param requestAttr当前请求的对象表示形式{@link requestAttr}
*@返回字符串
*/
@抑制警告(“未选中”)
公共静态对象putPageErrorAttr(字符串键、对象值、RequestAttr RequestAttr){
试一试{
映射pageLevelErrorMessages;
如果(!requestAttr.containsKey(键)){
pageLevelErrorMessages=新建HashMap();
pageLevelErrorMessages.put(键、值);
requestAttr.put(页面级别错误消息,页面级别错误消息);
}否则{
if(requestAttr.get(页面级别错误消息)映射实例){
pageLevelErrorMessages=(映射)requestAttr.get(页面级别错误消息);
pageLevelErrorMessages.put(键、值);
requestAttr.put(键,pageLevelErrorMessages);
}否则{
抛出新异常();
}
}
}捕获(例外e){
log.error(“预期的pageLevelErrorMessages映射是错误消息的保留键,它不是预期的类型,Map”);
}
返回值;
}
}
请建议

将是一个更好的地方

说到你的问题

下面的代码并不是真正定义一个API,它实际上应该抛出异常,通知调用方出了问题

activate
,因为一个方法需要执行一些操作,而当它不能执行时,它可以抛出一个异常。如果该方法是