web开发中的异常处理
Posted Kirl z
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web开发中的异常处理相关的知识,希望对你有一定的参考价值。
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开发中的异常处理的主要内容,如果未能解决你的问题,请参考以下文章
java.util.MissingResourceException: Can't find bundle for base name init, locale zh_CN问题的处理(代码片段