异常的处理方式

来源:互联网 发布:oracle数据库备份命令 编辑:程序博客网 时间:2024/06/05 13:27

在登陆中异常的处理:

package com.tarena.netctoss.dao;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import javax.annotation.Resource;import javax.sql.DataSource;import org.springframework.stereotype.Repository;import com.tarena.netctoss.entity.Admin;/** * 持久层实现 */@Repository("adminDAO")public class AdminDAOJdbcImpl implements AdminDAO {@Resource(name="ds")private DataSource ds;//将连接池(此处使用接口)依赖注入public Admin findByAdminCode(String adminCode) {Admin admin = null;Connection conn = null;try {conn = ds.getConnection();String sql = "SELECT * FROM admin_info WHERE admin_code=?";PreparedStatement ps = conn.prepareStatement(sql);ps.setString(1, adminCode);ResultSet rs = ps.executeQuery();if(rs.next()){admin = new Admin();admin.setAdminId(rs.getInt("admin_id"));admin.setAdminCode(rs.getString("admin_code"));admin.setPassword(rs.getString("password"));admin.setName(rs.getString("name"));admin.setTelephone(rs.getString("telephone"));admin.setEmail(rs.getString("email"));admin.setEnrolldate(rs.getTimestamp("enrolldate"));return admin;}} catch (SQLException e) {//获取连接失败,属于系统异常//发生异常后,记录日志e.printStackTrace();/** * 看能否恢复异常,如果能够则立即回复 * 如果不能够(例如数据库停止服务),则提示用户稍后重试 */throw new RuntimeException(e);} finally{if(conn != null){try {conn.close();} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}}return admin;}}

在持久层中,包装后并抛出异常RuntimeException,抛给service层

业务层代码为:

package com.tarena.netctoss.service;import javax.annotation.Resource;import org.springframework.stereotype.Service;import com.tarena.netctoss.dao.AdminDAO;import com.tarena.netctoss.entity.Admin;@Service("loginService")public class LoginServiceImpl implements LoginService {@Resource(name="adminDAO")private AdminDAO dao;public Admin checkLogin(String adminCode, String pwd) {Admin admin = null;admin = dao.findByAdminCode(adminCode);if(admin == null){//帐号不存在//帐号不存在,抛出一个应用异常(由于用户操作错误)throw new ApplicationException("帐号不存在");}if(!admin.getPassword().equals(pwd)){//账号存在,密码错误throw new ApplicationException("密码错误");}//登录成功return admin;}}
业务层异常包装成ApplicationException异常向上抛出给控制器,由控制器来处理

处理器:

package com.tarena.netctoss.controller;import javax.annotation.Resource;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpSession;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import com.tarena.netctoss.entity.Admin;import com.tarena.netctoss.service.ApplicationException;import com.tarena.netctoss.service.LoginService;@Controllerpublic class LoginController {@Resource(name="loginService")private LoginService service;@RequestMapping("/toLogin.do")public String toLogin(){//转发到登录页面System.out.println("toLogin()");return "login";}@RequestMapping("/login.do")public String login(HttpServletRequest request,HttpSession session) {//重定向到首页//获取请求参数String adminCode = request.getParameter("adminCode");String pwd = request.getParameter("pwd");System.out.println(adminCode+","+pwd);//调用业务层,其中checkLogin方法可能有异常抛出,有控制层来处理try{Admin admin = service.checkLogin(adminCode, pwd);//把admin对象绑定到session,用于验证session.setAttribute("admin", admin);}catch(Exception e){e.printStackTrace();if(e instanceof ApplicationException){//应用异常,明确提示用户正确的操作,返回登录页面,并提示request.setAttribute("login_failed", e.getMessage());return "login";}//系统异常,提示用户稍后重试return "error";}//没有任何异常,从定向到首页return "redirect:toIndex.do";}@RequestMapping("/toIndex.do")public String toIndex(){return "index";}}
处理器对可能出现的异常进行分类处理:

由于用户输入造成的为应用异常,转发到相应页面即可

由于系统错误造成的为系统异常(连接数据库失败、断网等)转发到相应页面即可

若没有异常则从定向到指定页面

===========================================================================

以上处理方式是通过try{}catch()进行处理,还可以将异常交给spring容器来处理

 springmvc提供的异常处理机制

我们可以将异常抛给spring框架,让spring来帮我们处理异常。

(1)使用简单异常处理器

step1. 配置简单异常处理器。

step2. 添加对应的异常处理页面。
注:该方式只适合处理简单异常的处理,如果要对异常做复杂处理,比如 记录日志等,则不合适了。

(2)使用@ExceptionHandler注解

step1. 在处理器类当中,添加一个异常处理方法, 该方法要使用@ExceptionHandler注解来标注。

step2.添加对应的异常处理页面

相应代码如下:

<!-- 配置简单异常处理器 --><bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">  <property name="exceptionMappings">    <props>      <prop key="java.lang.NumberFormatException">error1</prop>      <prop key="java.lang.StringIndexOutOfBoundsException">error2</prop>    </props>  </property></bean>
或者:

@ExceptionHandler//使用注解处理contorller中的异常public String exHandle(Exception ex,HttpServletRequest request){if(ex instanceof ApplicationException){request.setAttribute("login_failed", ex.getMessage());return "login";}else{//系统异常return "error";}}