异常处理
为啥要用异常处理?
正常程序处理异常有两种:
1.将错误信息return给前端
2.将错误信息已异常形式抛给前端
return与throw的区别:
当在service层处理业务逻辑的时候,所有的业务的代码都写在当前的service方法中的时候,那么,使用return和throw用起来基本没啥区别
当在service层处理的业务的时候,还需要调用自己封装的方法的时候,那么在封装的方法中return出来的错误信息则还需要经过自己来处理一遍,在返回给前端,这样就增加了很多无用的操作,这时候用throw抛出异常就会便捷很多
统一异常处理
说明:
通常一个web程序在运行过程中,由于用户的操作不当,或者程序的bug,有大量需要处理的异常。其中有些异常是需要暴露给用户的,比如登陆超时,权限不足等等。可以通过弹出提示信息的方式告诉用户出了什么错误。
而这就表示在程序中需要一个机制,去处理这些异常,将程序的异常转换为用户可读的异常。而且最重要的,是要将这个机制统一,提供统一的异常处理。
实现:
新增一个统一异常处理类并且在类上面添加注解 @RestControllerAdvice
然后在类中新建方法,并在方法上面添加注解 @ExceptionHandler(value = Exception.class),该注解中的value属性的值为何种异常,那么就会拦截到这类异常
注:此统一异常只能拦截Controller层的异常
自定义异常
对于需要用户自己捕获处理的异常呢,则需要用自定义异常,对于无需关心的异常,则可以不用使用自定义异常
自定义异常只需继承异常类即可
国际化配置
1.在pom文件中引入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
2.在resources文件中新增国际化资源文件
3.在spingboot配置文件中配置国际化:
#国际化配置
messages:
basename: i18n/messages #指定message的basename,多个以逗号分隔,如果不加包名的话,默认从classpath路径开始,默认: messages
cache-seconds: -1 #设定加载的资源文件缓存失效时间,-1的话为永不过期,默认为-1
encoding: UTF-8
defaultEncoding: UTF-8 #当根据语言类型查询不到资源时,读取默认资源文件,默认资源文件格式设置
4.注入MessageSource这个bean
5.调用MessageSource中的getMessage方法:
messageSource.getMessage(msgName, null, Locale)
说明:msgName为资源文件中的资源id,Locale为获取哪种语言
另外,spring在国际化中还提供了占位符功能,使用
“{0}”
,使用代码:
MessageFormat format = new MessageFormat(msg, Locale.CHINA);
Object[] params = {orgMsg};
String message = format.format(params);
将要替换占位符的字符串用一个数组装起来,然后替换掉占位符,数组下标对应的就是占位符的中括号里的值
6.资源文件格式
msg = 没有这个用户
这个是没有占位符的格式
msg代表后面值的id,后面的值就是要翻译的值
msg = 没有{0}这个用户{1}
这个是有占位符的格式
当你数组里有数据的时候,就会将占位符给替换掉