我在查閱由開發人員編寫的以下代碼。我不是一個Java專家但恕我直言,我沒有感覺到這是有效利用例外 - 我覺得這樣的理由是:編寫例外的更好方法 - 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!\"#$%&'()*+,-./:;<=>[email protected][\\]^_`{|}~\\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;
}
}
請提出
我不喜歡他們中的任何一個。錯誤記錄應該在檢測到的塊內發生。這裏根本不應該有任何投擲。 – EJP
使用異常進行流量控制是極其糟糕的做法。例外情況適用於特殊情況,並且創建起來非常昂貴。我必須先清理這樣的代碼。 –