Java异常介绍及Spring Boot统一异常处理

1. 异常介绍

Java异常处理是Java编程语言中用于处理程序运行时出现的异常情况的一种机制。异常情况指的是程序运行过程中出现的非正常情况,比如除以零、数组越界、空指针访问等。Java异常处理机制可以帮助程序员更好地管理这些异常情况,保证程序的稳定性和可靠性。

Java异常处理主要通过try-catch语句块来实现。try语句块中包含可能会抛出异常的代码,而catch语句块用于捕获并处理try语句块中抛出的异常。如果try语句块中的代码出现异常,程序会立即跳转到相应的catch语句块中执行异常处理代码。

除了try-catch语句块外,Java还提供了finally语句块,用于在try和catch语句块执行完毕后执行一些必要的清理工作,比如关闭文件、释放资源等。无论是否出现异常,finally语句块中的代码都会被执行。

2. 异常处理

Java中的异常处理主要涉及以下几个方面:

  1. 异常类型:Java中的异常分为两种类型:检查型异常(Checked Exceptions)和非检查型异常(Unchecked Exceptions)。检查型异常通常是在编译时必须处理的异常,例如文件I/O操作可能抛出的IOException。非检查型异常(通常是运行时异常)是在运行时才可能出现的异常,例如NullPointerException。
  2. 捕获和处理异常:Java使用try-catch语句来捕获和处理异常。try块包含可能会抛出异常的代码,而catch块包含处理这些异常的代码。例如:
try {  // 可能会抛出异常的代码  
} catch (IOException e) {  // 处理IOException的代码  
}

如果try块中的代码抛出一个IOException,那么程序会跳转到相应的catch块来处理这个异常。

  1. 声明和抛出异常:在方法签名中,可以使用关键字throws来声明该方法可能会抛出的异常。例如:
public void readFile(String filename) throws IOException {  // 可能会抛出IOException的代码  
}

当一个方法可能抛出一个被声明的异常时,调用该方法的代码必须处理这个异常,或者它可以选择再次声明该异常(如果它自己也可能抛出该异常)。

  1. finally块:不论是否发生异常,finally块中的代码总是会被执行。这对于清理资源(如关闭文件或数据库连接)非常有用。例如:
try {  // 可能会抛出异常的代码  
} catch (IOException e) {  // 处理IOException的代码  
} finally {  // 清理资源的代码  
}
  1. 使用try-with-resources:从Java 7开始,可以使用try-with-resources语句自动关闭实现了AutoCloseable接口的资源。例如:
try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) {  // 使用BufferedReader的代码  
} catch (IOException e) {  // 处理IOException的代码  
}

在这个例子中,无论是否发生异常,BufferedReader都会在退出try块时自动关闭。

  1. 自定义异常类:Java允许你创建自己的异常类,以表示特定于你的应用程序的错误条件。自定义异常类通常继承自Exception或其子类。例如:
class MyCustomException extends Exception {  public MyCustomException(String message) {  super(message);  }  
}

然后你可以像使用其他异常一样使用你的自定义异常类:

throw new MyCustomException("This is a custom exception");

或者在方法声明中使用它:

public void myMethod() throws MyCustomException {  // 可能会抛出MyCustomException的代码  
}

3. Spring Boot统一异常处理

Spring Boot 提供了强大的异常处理机制,可以帮助开发者统一处理应用中可能出现的异常。这种机制尤其在构建RESTful API时非常有用,因为它能够为客户端提供一个一致的错误响应格式。

以下是关于如何在 Spring Boot 中实现统一异常处理的详细介绍:

  1. 自定义异常类

首先,你需要创建一个或多个自定义异常类,这些类应该继承自 Spring 的 Exception 或其子类(如 RuntimeException)。例如:

public class CustomException extends RuntimeException {  private int status;  private String message;  public CustomException(int status, String message) {  super(message);  this.status = status;  this.message = message;  }  public int getStatus() {  return status;  }  public String getMessage() {  return message;  }  
}
  1. 异常处理器

创建一个 @ControllerAdvice 类来处理全局的异常。在这个类中,你可以使用 @ExceptionHandler 注解来指定哪些异常应该由该处理器处理。例如:

@ControllerAdvice  
public class GlobalExceptionHandler {  @ExceptionHandler(CustomException.class)  public ResponseEntity<Object> handleCustomException(CustomException ex) {  return new ResponseEntity<>(HttpStatus.valueOf(ex.getStatus()));  }  
}

在上面的例子中,当 CustomException 被抛出时,handleCustomException 方法会被调用,并返回一个带有适当 HTTP 状态码的 ResponseEntity

  1. 使用 @ResponseStatus 注解

对于某些特定的异常,你可能想直接在异常类上使用 @ResponseStatus 注解,这样就不需要在处理器中返回 ResponseEntity。例如:

@ResponseStatus(HttpStatus.BAD_REQUEST)  
public class BadRequestException extends RuntimeException {  private static final long serialVersionUID = 1L;  
}
  1. 全局异常处理

如果你想处理所有未被特定处理器捕获的异常,你可以在 GlobalExceptionHandler 类中添加一个额外的处理器:

@ExceptionHandler(value = Exception.class)  
public ResponseEntity<Object> handleAllExceptions(Exception ex) {  return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);  
}
  1. REST API 的响应体

当返回一个响应体时,通常建议包含一些额外的信息,如错误消息、堆栈跟踪或任何其他有关错误的详细信息。你可以根据需要自定义这些信息。例如:

@ExceptionHandler(CustomException.class)  
public ResponseEntity<Object> handleCustomException(CustomException ex) {  return new ResponseEntity<>(new ErrorDetails(ex), HttpStatus.valueOf(ex.getStatus()));  
}

其中 ErrorDetails 是一个简单的 POJO,包含错误详情。

  1. 自定义 HTTP 状态码
  • 对于Spring Boot 2.x版本,你可以使用 HttpStatus.Series 来指定一个系列,如 Series.CLIENT_ERRORSeries.SERVER_ERROR。这允许你为异常定义更具体的 HTTP 状态码系列。例如: @ResponseStatus(value = HttpStatus.BAD_REQUEST, series = HttpStatus.Series.CLIENT_ERROR)*。 对于Spring Boot 1.x版本,你只能使用预定义的HTTP状态码(如 HttpStatus.BAD_REQUEST)。7. 在 Controller 层使用 @ExceptionHandler:你也可以在 Controller 层为特定的方法或请求路径添加 @ExceptionHandler。这允许你为特定的异常或错误条件提供定制的响应。例如: @ExceptionHandler(value = CustomException.class)。总之,通过上述方式,你可以在 Spring Boot 应用中实现统一且可扩展的异常处理机制。这有助于提高应用的健壮性、可维护性和用户体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/571607.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

React- jsx的使用可以渲染html标签 或React组件

React 的 JSX 使用大、小写的约定来区分本地组件的类和 HTML 标签。既渲染html标签需要使用小写字母开头的标签名而渲染本地React组件需要使用大写字母开头的标签名 注意: 由于 JSX 就是 JavaScript&#xff0c;一些标识符像 class 和 for 不建议作为 XML 属性名。作为替代&…

bigdecimal保留4位小数_四年级数学小数的加减乘法知识点汇总,带练习!

张老师 - 4年级(多品小学教育)顺城中心小学郭老师和环县虎洞中心小学谭老师需要的这份学习资料现在分享。本资料已制作电子版下载码是&#xff1a;76qa32vd《小数的加减乘法》知识点一、小数加、减法的计算法则(1)小数点要对齐&#xff0c;也就是相同数位要对齐&#xff1b;相同…

python 字符串 4位一组_Python基础4- 字符串

Python字符串是由数字、字母、下划线组成的一串字符,我们可以使用引号来创建字符串。如:str Helloworld在Python中没有char类型,单个字符也作为string使用;Python的字符串列表有2种取值顺序&#xff1a;A.自左向右,默认索引从0开始,索引长度最长为字符串长度-1B.自右向左,默认…

学python编脚本_python 学习写脚本

学习python中&#xff0c;练手&#xff01;模拟注册登录的例子写的一个简单的脚本#!/usr/bin/env python#--coding: utf-8 --#如果需要开启输入密码不可见&#xff0c;请去掉所有含getpass的代码行的注释&#xff0c;并注释相关的行。此行为注释说明#import getpass#确认python…

毕业设计后续工作目标

周数 工作内容 10周 周一 1.需求调研模块&#xff1a;人员&#xff0c;设备&#xff0c;资金&#xff0c;日程的设置及进程管理 周二 1.需求分析和调研模块&#xff1a;完成用例图&#xff0c;交互图和用例文档的上传、查看及保存 周三 1.生成软件需求规格说明书&#…

vs未指定启动文件_高效开发利器之自定义模板文件

简介越来越多的设计模式, 最佳实践, 优化了软件开发方式, 提高了软件质量, 但是也带来了大量的类似的文件. 比如说: 现在都使用三层模式来开发Web程序, 都会有服务层(Service), DI的流行, 每个服务类都会自动注入一些固定的对象, 日志对象, 缓存对象等等. 实体类(Entity)到DTO对…

react-router 4.0 学习笔记

1、安装react-router-dom 2、页面上要使用的时候要引入  import {BrowserRouter as Router,Route,Link } from react-router-dom 3、使用的时候要在外层包一个<Router> 4、param 在路径上如果带有/:id类似这种的&#xff0c;要取值的时候&#xff0c;match.params.id取…

分数优先遵循志愿php源码_2021年南昌中考志愿填报指导,这七大要点你都了解吗?...

中考是孩子即将面对人生的第一个十字路口&#xff0c;家长们也因此开始为孩子的未来紧张。都说选择大于努力&#xff0c;给孩子选一个适合的学校也很重要&#xff0c;为了大家可以更好的填报志愿&#xff0c;小编为大家汇总了这份指南&#xff0c;快来一起看看吧~1、认清自己&a…

gin ip 和 本地访问的结果不一样_golang web开发——gin实战之整合swagger

背景如果我们之前搞过java web开发&#xff0c;我们应该都知道swagger这个API文档自动生成利器&#xff0c;有了swagger可以方便我们与客户端的联调&#xff0c;基本上是一目了然&#xff0c;swagger支持java&#xff0c;自然它也能支持golang的gin框架&#xff0c;本小节&…

常用运算符和表达式

运算符在程序中应用广泛&#xff0c;尤其在计算功能中&#xff0c;常常需要大量的运算符。运算符结合操作数&#xff0c;便形成了表达式&#xff0c;并返回运算结果。 一. 运算符 1.算术运算符 算术运算符用于对数值数据进行计算。 在C#语言中&#xff0c;根据两个操作数的类型…

python爬取淘宝数据魔方_淘宝数据魔方技术架构解析

淘宝网拥有国内最具商业价值的海量数据。截至当前&#xff0c;每天有超过30亿的店铺、商品浏览记录&#xff0c;10亿在线商品数&#xff0c;上千万的成交、收藏和评价数据。如何从这些数据中挖掘出真正的商业价值&#xff0c;进而帮助淘宝、商家进行企业的数据化运营&#xff0…

opencv 处理黑夜_1.1 OpenCV+Python引言篇(一)

OpenCV是一个用于图像处理、分析、机器视觉方面的开源函数库。无论你是做科学研究&#xff0c;还是商业应用&#xff0c;OpenCV都可以作为你理想的工具库&#xff0c;因为&#xff0c;对于这两者&#xff0c;它完全是免费的。该库采用C及C语言编写&#xff0c;可以在windows, l…

python字典导入mongodb_python连接mongoDB进行数据提取→常用操作指南

1. 连接mongo需要知道mongoDB的地址、端口、授权用户、授权密码。一般情况下&#xff0c;技术都会给到数据分析人员这些信息。python没有安装模块pymongo模块的&#xff0c;在cmd里面&#xff0c;pip install pymongo 进行安装。(具体操作可以自行百度)##导入连接mongo需要的模…

解决C语言程序报错:return type defaults to‘int’

下面是通过自定义一个函数printN&#xff0c;之后在main函数中调用printN&#xff0c;使得可以通过输入整数N&#xff0c;将从1到N的全部整数都打印出来的程序。 但是在编译过程中却报错&#xff1a; return type defaults to ‘int’ 产生报错的原因&#xff1a; printN的默认…

cif是目的港交货吗_刚接手出口业务,搞不懂FOB? CIF? 为你科普→

Export专用名词辨析01 名词辨析#FOBFOB(Free On Board)&#xff0c;含义是装运港船上交货&#xff0c;指卖方在合同规定的装运港负责将货物装上买方指定的船上&#xff0c;并负责货物装船之前的一切费用和风险&#xff0c;以及办理出口通关的相关事宜及费用&#xff0c;所以在实…

python字符串的表示形式_python - 如何为类对象创建自定义字符串表示形式?_class_酷徒编程知识库...

当前python 3的更新如下&#xff1a;class MC(type):def __repr__(self):return Wahaha!class C(object, metaclassMC):passprint(C)如果希望跨python 2和python 3运行的代码&#xff0c;则six模块将包含以下内容&#xff1a;from __future__ import print_functionfrom six im…

MyBatis核心接口和类

三大对象&#xff1a; 1、SqlSessionFactoryBuilder&#xff1a;负责构建SqlSessionFactory&#xff0c;并且提供了多个build()方法的重载 2、SqlSessionFactory&#xff1a;创建SqlSession实例的工厂 3、SqlSession&#xff1a;用于执行持久化操作的对象 三大对象获取的步骤&a…

中的数组怎么转成结构体_传说中的“衡水体”应该怎么练?

传说中的“衡水体”应该怎么练&#xff1f;我也不知道&#xff0c;哈哈哈哈哈哈。因为我之前关于衡水体的回答最高赞评论说我这个不是衡水体……随便写的之前的回答所以&#xff0c;这篇文章纯属交流分享&#xff0c;同时枯燥无味&#xff0c;可能适合觉得自己书写不好看的高中…

windows 显示苹果分区_基准测试数据显示苹果M1运行Windows的表现比微软自家硬件好上近一倍...

根据最新的基准测试&#xff0c;苹果M1运行 "Windows 10 on ARM "的速度比微软自家的硬件快了近2倍。更新后的基准数据显示&#xff0c;苹果M1上的Windows 10比Surface Pro X快得多&#xff0c;这还是配备了基于骁龙8cx的处理器的Surface Pro X原生运行该操作系统的环…

centos7默认字体_CentOS7.5字体美化

背景知识有衬线 (Serif) 无衬线 (Sans Serif) 和等宽 (Monospace) 字型1 有衬线 (Serif) 字型是比较正式的字体&#xff0c;比划粗细不一&#xff0c;在笔划的边缘有装饰部分(我的理解是有笔锋)。英文当中比较有名的包括 Times New Roman, Georgia, 而中文当中则是包括大名鼎鼎…