1.1 异常可以配置友好错误页面
1.1.1 web项目 , 可以配置web.xml
像这样的:当找不到页面的时候,会直接跳转到我们自定义的404.jsp
<error-page>
<error-code>404</error-code>
<location>/404.jsp</location>
</error-page>
1.1.2 如果底层使用的是Hibernate,可以这样配置,struts.xml
<global-exception-mappings>
<exception-mapping result="error" exception="java.lang.Exception"></exception-mapping>
</global-exception-mappings>
<!-- 配置全局结果集 -->
<global-results>
<result name="error">/error.jsp</result>
</global-results>
但是,这样也会出现这样的困惑,这样仅仅是解决了用户的感受,不用在页面打印堆栈信息,但是在进行异常处理,不够灵活和细粒度的控制不够。
1.2 使用代理机制 , web层如果是Struts2 , struts2定义拦截器控制异常
大致可以是这样的:
public class MyExceptionInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
String result = null;
try {
result = invocation.invoke();
} catch (Exception e) {
// 进行异常的捕获和处理
result = "error";
}
return result;
}
}
<interceptor-stack name="privilegeStack">
<interceptor-ref name="myexception"></interceptor-ref> <!-- 异常拦截器配置到最前端 -->
<interceptor-ref name="defaultStack"></interceptor-ref>
<interceptor-ref name="login"></interceptor-ref>
<interceptor-ref name="privilege"></interceptor-ref>
</interceptor-stack>
在异常拦截器,发生异常后,进行细节处理(记录日志,发送邮件等)
1.3 在企业开发中 , 如果Service 层 和DAO层 , 发生异常,是catch 还是 throws?
在企业中一般会先 catch 这个异常 , 然后转化为一个业务运行异常抛出 。 因为如果加入DAO层报了一个SQL的异常,但是自己不能去解决这个异常(能解决就不用catch了),你选择抛出,到Service去调用这个DAO的时候,Service层更加不知道怎么去解决这个SQL的异常。所以当我们抛出一个具体的业务异常,上层就会更知道如何去处理!
1.4 服务器对于Ajax 和 非Ajax 请求,处理方式不同
非Ajax请求,返回错误页面就可以了
Ajax请求 , 应该是返回json的异常信息
如何来分辨是否为Ajax请求:
// 判断是否为ajax请求
if (ServletActionContext.getRequest().getHeader("X-Requested-With") != null) {
// ajax 请求
Map<String, Object> map = new HashMap<String, Object>();
map.put("result", "failure");
map.put("msg", "修改密码失败," + e.getMessage());
ActionContext.getContext().put("map", map);
result = "errorjson";
} else {
result = "error";
}
<result name="errorjson" type="json">
<param name="root">map</param>
</result>
代码可能,不适合运行,都是我抽取出来的,主要的是一种异常处理的思路!有什么好的想发,可以多多留言哦!