电脑做h5比较好的网站,软件项目管理案例教程第四版答案,网业分离是什么,广州网站制作电话接上篇#xff1a;后端项目操作数据库-中枢组件Service调用Mapper 自定义异常#xff1a; 手动抛出异常#xff0c;为了后续统一捕获#xff0c;需要异常自定义#xff1b; 如#xff1a;当使用抛出异常的方式表示“操作失败”时#xff0c;为了后续统一捕获#xff0c…接上篇后端项目操作数据库-中枢组件Service调用Mapper 自定义异常 手动抛出异常为了后续统一捕获需要异常自定义 如当使用抛出异常的方式表示“操作失败”时为了后续统一捕获自定义的异常符合该处理的情景。
1.RuntimeException检查异常非检查异常
在 Java 中RuntimeException 及其子类的异常被称为非检查异常Unchecked Exception而其他的异常如 IOException 或 SQLException 等则被称为检查异常Checked Exception。
对于非检查异常通常是由程序员编写的代码错误引起的如空指针异常或数组越界异常等。因此如果程序出现这些异常通常意味着程序的实现存在问题需要在代码中进行改进。
相比之下检查异常则需要在方法的声明或方法调用者的声明中声明抛出此异常。因为检查异常通常由外部因素如文件操作、网络请求等引起并且需要在编写代码时考虑异常处理的情况。可能会导致程序无法正常工作所以编码时必须将这些异常捕获或向上抛出来保证程序的稳定性和可靠性。
2.后端建议自定义异常继承RuntimeException
自定义异常必须继承自某个已存在的异常类型强烈建议继承RuntimeException其原因有二
原因1 在项目中要想统一处理全局异常则Service组件、Controller组件都必须抛出异常才能由Spring MVC框架捕获到异常进而通过全局异常处理器进行统一的处理 RuntimeException不会受到异常的相关语句约束而非RuntimeException一旦被抛出方法的声明、方法的调用者的声明等都需要声明抛出此异常。 由于抛出异常是固定的做法没有必要在各个方法上都声明抛出此异常所以应该使用RuntimeException
原因2 配合Spring JDBC框架实现事务管理
3.异常分类
Java异常体系可以分为以下几个层次 ThrowableThrowable 是所有异常的根类它有两个直接子类 Error 和 Exception。 ErrorError 表示系统级别的错误或无法恢复的错误一般在程序中不捕获和处理 Error例如 OutOfMemoryError内存不足和 StackOverflowError栈溢出。 ExceptionException 表示程序运行时的异常情况是开发者通常需要处理的异常。Exception 下面又分为两种类型RuntimeException 和非 RuntimeException。 RuntimeExceptionRuntimeException 是非检查异常也称为运行时异常它们不需要在编码时显式地处理或声明。常见的 RuntimeException 有 NullPointerException空指针异常和 ArrayIndexOutOfBoundsException数组越界异常。 非 RuntimeException非运行时异常是必须进行显示的处理或声明的异常。这种异常是通过 Java 编译器检查的编译器要求你必须捕获或向上抛出这些异常。常见的非 RuntimeException 有 IOException输入输出异常和 ClassNotFoundException类未找到异常。
根据这样的分类开发者可以选择性地处理或声明异常。对于 RuntimeException可以选择不捕获而对于非 RuntimeException必须在代码中显式地捕获或声明否则程序无法通过编译。
4.自定义异常-举例
每次抛出异常都应该是出现了某种“错误”应该对此“错误”进行描述关于此描述应该是“谁抛出谁描述” 应该在自定义异常类中添加基于父类异常的带String message参数的构造方法例如
public class ServiceException extends RuntimeException {// 关键需要此构造方法public ServiceException(String message) {super(message);}
}后续抛出异常时应该通过以上构造方法封装对异常的描述
// 检查相册名称是否已经被占用
String name albumAddNewDTO.getName();
int countByName albumMapper.countByName(name);
if (countByName 0) {String message 添加相册失败相册名称已经被占用;log.warn(message);throw new ServiceException(message); // 【调整】在构造方法中封装message
}后续捕获异常的位置将不再需要“猜测”出现异常的原因而是从捕获到的异常对象中直接获取以上封装的描述信息即可
try {service.addNew(album);log.debug(添加相册成功);
} catch (ServiceException e) {log.debug(捕获到异常其中的消息{}, e.getMessage()); // 【调整】从异常对象中获取信息
}参考异常体系之RuntimeException解析 声明部分代码来自有网络文章只供学习参考 创造价值乐哉分享