java如何抛出异常

2023-05-16

1.什么时候抛出异常?

如果你觉得某些”问题”解决不了了,那么你就可以抛出异常了。比如,你在写一个service,其中在写到某段代码处,你发现可能会产生问题,那么就请抛出异常吧,相信我,你此时抛出异常将是一个最佳时机

2.抛出怎么样的异常?

  异常的抛出不仅仅是throw掉或者catch掉,而也应该进行异常的业务逻辑的处理所以本身也可以看做if--else的这样的一种分支进行处理掉

传统的项目都是以MVC框架为基础进行开发的,本文主要从使用restful风格接口的设计来体验一下异常处理的优雅。

我们把关注点放在restful的api层(和web中的controller层类似)和service层,研究一下在service中如何抛出异常,然后api层如何进行捕获并且转化异常。

使用的技术是:spring-boot,jpa(hibernate),mysql,

1.对于入参参数的判断:

   有两个重要的工具类

  1. Guava中的Preconditions类实现了很多入参方法的判断
  2. jsr 303的validation规范(目前实现比较全的是hibernate实现的hibernate-validator)
  3. 如果使用了这两种推荐技术,那么入参的判断会变得简单很多。推荐大家多使用这些成熟的技术和jar工具包,他可以减少很多不必要的工作量。我们只需要把重心放到业务逻辑上。而不会因为这些入参的判断耽误更多的时间

2.我们经常说的模型其实就是指的是实体模型,由实体模型之间的关系构成了整个逻辑之间的关系,而这个实体模型之间的关系其实也是数据库数据之间的关系.所以这个就是模型的概念

根据项目场景来看,需要两个domain模型,一个是用户实体,一个是地址实体

对于约束条件的总结如下:

  1. 基本判断约束(null值等基本判断)
  2. 实体属性约束(满足jsr 303等基础判断)
  3. 业务条件约束(需求提出的不同的业务约束)
  4. 对于service中的抛出异常,笔者认为大致有两种抛出的方法:

  5. 抛出带状态码RumtimeException异常
  6. 抛出指定类型的RuntimeException异

api异常设计

大致有两种抛出的方法:

  1. 抛出带状态码RumtimeException异常
  2. 抛出指定类型的RuntimeException异常
  3. 这个是在设计service层异常时提到的,通过对service层的介绍,我们在service层抛出异常时选择了第二种抛出的方式,不同的是,在api层抛出异常我们需要使用这两种方式进行抛出:要指定api异常的类型,并且要指定相关的状态码,然后才将异常抛出,这种异常设计的核心是让调用api的使用者更能清楚的了解发生异常的详细信息,除了抛出异常外,我们还需要将状态码对应的异常详细信息以及异常有可能发生的问题制作成一个对应的表展示给用户,方便用户的查询。(如github提供的api文档,微信提供的api文档等),还有一个好处:如果用户需要自定义提示消息,可以根据返回的状态码进行提示的修改。
  4. 设计api层异常时,正如我们上边所说的,需要提供错误码和错误信息,那么可以这样设计,提供一个通用的api超类异常,其他不同的api异常都继承自这个超类:

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java如何抛出异常 的相关文章

随机推荐

  • [!] Gradle threw an error while downloading artifacts from the network. Retrying to download... Runn

    Gradle threw an error while downloading artifacts from the network Retrying to download Runn 报这个错 把zip包直接放到c盘某个位置 并更改and
  • idea控制台乱码问题

    idea控制台乱码问题 在环境变量上增加 JAVA TOOL OPTIONS 61 Dfile encoding 61 UTF8 然后idea重新打开即可
  • 如何清除/重置一枚NFC标签教程

    如果您的NFC标签已经写入了数据 xff0c 然后您又想把他清除或者重置 xff0c 请按照如下教程 1 首先下载APP xff0c TagWriter xff0c 这是芯片厂商NXP官方推出的APP xff0c 可以说是最权威的 xff0
  • 树莓派系列教程:红外遥控

    网上淘到了一个红外接收器 xff08 HX1838 43 NEC编码红外遥控器 xff09 和一个红外遥控器 xff0c 准备放到树莓派上学习一下红外控制 img http dl2 iteye com upload attachment 0
  • JavaFX Alert对话框

    1 标准对话框 消息对话框 br Alert alert 61 new Alert AlertType INFORMATION br alert setTitle 34 Information Dialog 34 br alert setH
  • 操作系统原理与实践5--内核栈切换的进程切换

    基于内核栈切换的进程切换 难度系数 xff1a 实验目的 深入理解进程和进程切换的概念 xff1b 综合应用进程 CPU管理 PCB LDT 内核栈 内核态等知识解决实际问题 xff1b 开始建立系统认识 实验内容 现在的Linux 0 1
  • 陀螺仪、加速计、磁力计等传感器汇总

    陀螺仪就是内部有一个陀螺 xff0c 它的轴由于陀螺效应始终与初始方向平行 xff0c 这样就可以通过与初始方向的偏差计算出实际方向 手机里陀螺仪实际上是一个结构非常精密的芯片 xff0c 内部包含超微小的陀螺 加速计是用来检测手机受到的加
  • STM32 HAL库串口+DMA接收不定长数据

    在串口通信中 xff0c 很多时候我们需要的是接收一帧不确定长度的数据 xff0c 而不是单个字节或者固定长度 xff0c 这时我们就需要利用STM32的空闲中断 xff08 IDLE xff09 来实现不定长数据的接收 xff0c 首先我
  • cmake学习之道

    cmke命令格式 cmake 选项 路径 最主要的选项 D 添加变量及值 使用案列 xff08 cmake D ARM BUILD 61 1 xff09 表示在当前路径执行Cmake命令并将ARM BUILD的值传到CMakeLists t
  • 20230312在Ubuntu18.04下的安装Chrome

    20230312在Ubuntu18 04下的安装Chrome 2023 3 12 23 42 百度搜索 xff1a chrome ubuntu 参考资料 xff1a https blog csdn net howard2005 articl
  • ubuntu下查看服务器的CPU详细情况(分色排版)

    https www cnblogs com liuq p 5623565 html 全面了解 Linux 服务器 1 查看 Linux 服务器的 CPU 详细情况 ubuntu下查看服务器的CPU详细情况 大文实验室 大文哥 壹捌陆捌零陆捌
  • 为什么.h文件中只能申明不能定义全局变量

    最近使用keil编写下位机单片机程序 xff0c 打算进行模块化的设计 xff0c 遇到了在 h文件中定义全局变量报错的问题 原因 因为C语言的include是直接将文件嵌入到include这个地方的 如果多次包含这个头文件 xff0c 就
  • 跨系统传递 traceId(日志)

    34 新项目查日志太麻烦 xff0c 多台机器之间查来查去 xff0c 还不知道是不是同一个请求的 打印日志时使用 MDC 在日志上添加一个 traceId xff0c 那这个 traceId 如何跨系统传递呢 xff1f 34 1 背景
  • ThreadLocal 适合用在哪些实际生产的场景中?

    在通常的业务开发中 xff0c ThreadLocal有两种典型的使用场景 场景1 xff0c ThreadLocal 用作保存每个线程独享的对象 xff0c 为每个线程都创建一个副本 xff0c 这样每个线程都可以修改自己所拥有的副本 而
  • SpringCloud 分布式事务组件之Seata

    目录 背景介绍什么是分布式事务什么叫做逆向补偿呢互联网最流行的分布式事务组件seata总结 背景 大家好 xff0c 今天给大家分享一个在2022年出去面试Java几乎必问的一个技术 xff0c 那就是seata 什么 xff1f xff1
  • 接口优化方案

    1 批量思想 xff1a 批量操作数据库 优化前 xff1a for循环单笔入库 for TransDetail detail transDetailList insert detail 优化后 xff1a batchInsert tran
  • springboot前端传一个对象后台怎么接受

    34 courseId 34 3 34 userId 34 34 1234456676 34 34 list 34 34 id 34 34 1 34 34 answer 34 34 B 34 34 id 34 34 1 34 34 answ
  • 前端传一个数组或者集合后台怎么接受

    34 id 34 34 1 34 34 answer 34 34 A 34 34 id 34 34 1 34 34 answer 34 34 A 34 这样的可以直接用一个 64 RequesBody List lt QuestionBac
  • Java8处理List的双层循环

    Java处理List的双层循环程序员经常遇到 xff0c 一般都是当两个List某个值满足某条件时候 xff0c 进行相应的处理 xff1b 1 list和map之间的相互转换 两个List对象当id相同的时候 注意是两个对象 而非两个集合
  • java如何抛出异常

    1 什么时候抛出异常 如果你觉得某些 问题 解决不了了 xff0c 那么你就可以抛出异常了 比如 xff0c 你在写一个service 其中在写到某段代码处 你发现可能会产生问题 xff0c 那么就请抛出异常吧 xff0c 相信我 xff0