r);
e.setInitialMethod(staticPart.getSignature().getName());
}
}
}
在该层,我记录了异常的一段额外上下文,也就是在进入模型时正在执行的 对 象。然后可以在 Web 层使用该信息为用户提供帮助信息,如清单 6 所示:
清单 6. 用于用户界面错误处理的方面
aspect UIErrorHandling {
pointcut actionMethod (ActionMapping mapping,
HttpServletRequest request) :
execution (ActionForward Action.execute(..)) &&
args(mapping, *, request, *) && within(com.example..*);
ActionForward around(ActionMapping mapping,
HttpServletRequest request) :
actionMethod(mapping, request) {
try {
return proceed(mapping, request);
} catch (NoRemoveInUseException e) {
addError("error.noremoveinuse", e.getCurrent());
return mapping.getInputForward();
} catch (ModelException e) {
return handleError(e, mapping, request);
}
catch (InvocationTargetException e) {
ApplicationException ae =
new ApplicationException("populating form ", e);
return handleError(ae, mapping, request);
}
catch (Throwable t) {
ApplicationException ae =
new ApplicationException("unexpected throwable ", t);
return handleError(ae, mapping, request);
}
}
private ActionForward handleError(ApplicationException ae,
ActionMapping mapping, HttpServletRequest request) {
// track information to correlate with user request
ae.setRequest(request);
ae.logError(getLogger()); // logs context information...
session.setAttribute(Constants.MESSAGE_TEXT,
translate (e.getMessage()));
session.setAttribute(Constants.EXCEPTION, e);
return mapping.findForward(Constants.ERROR_PAGE);
}
private void addError(String errorId, Object current) {
// get name and key from Entity objects
// then add a Struts action error
}
}
AOP@Work: 使用方面的下几个步骤-学习建议之后(12)
时间:2011-09-07 IBM Ron Bodkin
UIErrorHandling 方面负责确保 com.example 包或其子包中的任何 Struts 动作均记录错误并进行处理。对于可恢复的错误(由 NoRemoveInUseException 表示),它只将错误及其相关上下文数据(正在使用的对象)提供给用户,并返 回至同一页面。对于其他错误,它将其转换为应用程序异常(其模型异常是子类 型),并指派给通用错误处理逻辑。错误处理逻辑记录 Web 请求的相关信息, 以 使错误与用户和会话相关联。最后它重定向至错误页面,将遇到的异常存储为附 加属性。
转发页面中存储的属性允许添加带信息的 HTML 备注,支持人员可以使用该 备注将用户错误与已记录的异常相关联。注意,应用程序异常被特殊记录: logError() 方法记录被捕获的所有附加上下文信息,其中提供了信息的 “黑盒 记录” 以确保可以隔离、重新生成和修复错误,而无需您思考 NullPointerException 中什么可能为空。特别是,它记录所有相关信息,比如 调用树中记录的参数和关键对象,以及传统的堆栈跟踪。
扩展库方面
最后,让我们看一下当希望基于现有库方面进行构建时会发生什么。在这种 情况下,我扩展了 Glassbox Ins |