web开发中的异常处理

Posted Kirl z

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web开发中的异常处理相关的知识,希望对你有一定的参考价值。

1. 异常处理的流程

  • 程序先执行 try 中的代码
  • 如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
  • 如果找到匹配的异常类型, 就会执行 catch 中的代码
  • 如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
  • 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
  • 如果上层调用者也没有处理的了异常, 就继续向上传递
  • 一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止

1.1 异常说明

我们在处理异常的时候, 通常希望知道这段代码中究竟会出现哪些可能的异常.
我们可以使用 throws 关键字, 把可能抛出的异常显式的标注在方法定义的位置. 从而提醒调用者要注捕获这些异常。

public static int divide(int x, int y) throws ArithmeticException {
    if (y == 0) {
        throw new ArithmeticException("此处抛出一个算术异常");
    }
    return x / y;
}
  • throw: 主动抛出异常,被抛出的异常,其实就是一个对象
  • throws: 标注当前的方法,可能抛出的异常

1.2 finally

我们知道, 使用finally的时候, finally都会被执行到.

注意事项:

  • finally执行的时机是在方法返回之前(try 或者 catch 中如果有return会在这个return之前执行finally), 如果 finally 中也有return 就会执行 finally中的return, 从而不会执行 try 中原来的 return语句
  • 一般不建议在finally中写return

1.3 自定义异常

  • 自定义异常通常会继承自Exception或者RunException
  • 继承自Exception的异常默认是受查异常(必须显示处理1.try catch 2. throws 抛出)
  • 继承自RunException的异常默认是非受查异常.

2. 模拟登陆异常处理

import lombok.Getter;
import lombok.Setter;
import org.example.model.JSONResponse;
import org.example.model.User;

import java.sql.SQLException;

public class Main {

    public static void main(String[] args) {
        //模拟用户登录功能
        //1.解析请求数据
        User u = new User();
        u.setUsername("abc");
        u.setPassword("123");
        /**
         * 2.业务处理:
         * (1)用户不存在:根据账号在数据库查,如果查不到就是
         * (2)用户名或密码错误:数据库查询的用户密码和http请求用户输入的密码比对,如果不一致
         * (3)登录成功:以上条件都不满足
         */
        JSONResponse json = new JSONResponse();
        try {
            User query = query(u.getUsername());
            if(query == null){
                throw new MyException("LOG001", "用户不存在");
            }else if(!query.getPassword().equals(u.getPassword())){
                throw new MyException("LOG002", "用户名或密码错误");
            }
            //登录成功
            json.setSuccess(true);
        } catch (Exception e) {
            e.printStackTrace();
            //设置错误信息
            if(e instanceof MyException){
                MyException me = (MyException) e;
                json.setCode(me.getCode());
                json.setMessage(me.getMessage());
            }else{
                //非自定义异常,把错误信息转换为用户有意义的信息
                json.setCode("ERROR000");
                json.setMessage("系统出错了,请联系管理员");
            }
        }

        //3.返回响应数据
    }
    //模拟数据库根据账号查用户信息
    public static User query(String username) throws SQLException {
        User u = null;
        if("abc".equals(username)){//模拟查询到一条用户记录
            u = new User();
            u.setUsername(username);
            u.setPassword("123");
        }else if("a".equals(username)){//模拟jdbc代码抛异常
            throw new SQLException("column 'usernam' not found");
        }
        return u;

    }

    @Getter
    @Setter
    private static class MyException extends RuntimeException{
        private String code;

        public MyException(String code, String message) {
            super(message);
            this.code = code;
        }

        public MyException(String code, String message, Throwable cause) {
            super(message, cause);
            this.code = code;
        }
    }
}

以上是关于web开发中的异常处理的主要内容,如果未能解决你的问题,请参考以下文章

使用片段中的处理程序时出现非法状态异常

十条jQuery代码片段助力Web开发效率提升

十条jQuery代码片段助力Web开发效率提升

web应用中的异常处理

WEB 项目中的全局异常处理

java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段