异常一定要捕获或继续向上抛出吗

oracle存储过程捕捉异常后回滚_ORACLE 存储过程异常捕获并抛出 for tab_name in tables loopexecute immediate 'drop table '||tab_name; --此处可能会报错end loop;当前情况是,循环表,进行删除,如果出现表不存在,则会异常中断,导致整个存储过程挂掉,需求是要能跳过错误的执行,不进行处理,进行下个循环。最终代码:for tab_name in tables loopbeginexecut... 阅读详情

先给结论

异常的分类

异常可以分为:checked exception和unchecked exception

  • unchecked exception
    Error和RuntimeException及子类
  • checked exception
    Throwable中除了以上两种所有子类

一定要捕获或继续向上抛出吗

语法层面:
checked exception,Yes
unchecked exception,No
良好的代码习惯 & 代码鲁棒性层面:
建议Yes,即对于unchecked exception也建议捕获或继续向上抛出。

为什么建议捕获或抛出unchecked exception

看个例子:
在这里插入图片描述
因为NPE是RuntimeException子类,所以test()没有进行捕获或抛出也成功编译。
同理,test的调用者,可以选择捕获/抛出,也可以如test方法一样不进行捕获或抛出(实际上,因为test调用者大概率不会阅读test源码,只看方法签名,大概率不会进行捕获或抛出)。
下面比较一下区别。

调用不捕获

在这里插入图片描述
运行结果:
在这里插入图片描述
可以看到,程序直接终止了——Process finished with exit code 1(正常结束的是code 0),这个进程因为这个Exception中断了,剩下的处理逻辑不再进行。可以对比SpringMVC中@ControllerAdvice + ExceptionHandler,请求处理失败时,Exception被catch,走ExceptionHandler处理逻辑,返回相应的错误码和response(即使是所有特定的Exception都落空 ,还有一个@ExceptionHandler(Exception.class)兜底)。
但是上例中,test()失败后整个进程finished,想象一下,如果是淘宝上一个购买请求走到这里,那么客户端得不到任何有效信息,e.g.
SpringBoot:
在这里插入图片描述
Postman:
在这里插入图片描述
Chrome:
在这里插入图片描述

调用捕获

在这里插入图片描述
结果 :
在这里插入图片描述
这和下面这个是一模一样的:
在这里插入图片描述
二者对比可以看出,如果test()方法内部的确抛出了异常(无论是调用的其他方法还是自己亲自throw new Exception),但是没有在方法签名上加,这样会导致调用者也不知道该方法会产生异常,“正常的外表”会迷惑调用者。考虑到层层调用(如递归依赖等),这样导致的结果可能是灾难性的。

启示

  • 作为服务/工具提供者,要做到“异常一定被捕获或继续向上抛出”

让程序所有的处理流程都在可控/预料范围内,提供给调用者的接口也是可靠的,不会出现接口文档之外的输出(Java方法签名本身就是接口文档:这个方法只会抛出>=签名上的异常)。

  • 作为服务/工具调用者,第三方的接口使用应慎之又慎

第三方提供的api,client,rpc等等,在catch完方法签名的异常之后,追加一个catch(Throwable e)是比较稳妥的办法。我们可以认为,只有原生的JDK本身是可靠的,其他都有bug的风险。

在实际开发中我们往往兼具两种角色,所以两方面都要注意 。

Python通用编程规范-09 安全编程规范 1.9 安全编程规范 1.9.1 异常行为 1.9.1.1 禁止抑制或者忽略已检查异常 【说明】: 编码人员常常会通过一个空的或者无意义的catch块来抑制捕获的已检查异常。每一个catch块都应该确保程序只会在继续有效的情况下才会继续运行下去。因此,catch块必须要么从异常情况中恢复,要么重新抛出适合当前catch块上下文的另一个异常以允许最邻近的外层try-catch语句块来进行恢复工作。异常会打断应用原本预期的控制流程。例如,try块中位于异常发生点之后的任何表达式和语句都不会被执行。因此,异常必须 阅读详情

相关推荐

【第七天】C++异常的抛出、捕获以及标准异常库

异常:是指在程序运行的过程中发生的一些异常事件(如:除0溢出,数组下标越界,所要 读取的文件不存在,空指针,内存不足,访问非法内存等等)。(异常是一个类。)异常处理就是处理程序中的错误。

m0_75045191的博客 2214

第六章.异常(Exception)

1.异常概述 异常是用来封装错误信息的一种机制;它由异常类型,提示信息,报错的行号提示三部分组成;编译不发生报错,但会中断运行。 2.常见异常类型 2.1数值异常:ArithmeticException public class ChangJianYiChangDome1 { public static void main(String[] args) { int a=10; int b=0; int c=a/b; //数值异

qq_51913153的博客 435

LaTeX新手入门以及TeXlive和TeXstudio的安装使用

作为一个新手,LaTeX的了解和使用很是费了一番功夫,因此,在这里给找不到路的同志们稍微介绍一下。如有错误,敬请指正。本篇内容基于Win10系统,因此安装在Mac或者Linux上的同学可以再找找其他的介绍文章。 目录 LaTeX介绍 LaTeX环境配置 一、TeXlive下载 二、TeXlive安装 1. 安装main installer 2. 正式安装 三、TeXstudio安装...

zywhehe的博客 21万+

Java异常简介及其架构

Java异常简介 Java异常是Java提供的一种识别及响应错误的一致性机制。 Java异常机制可以使程序中异常处理代码和正常业务代码分离,保证程序代码更加优雅,并提高程序健壮性。在有效使用异常的情况下,异常能清晰的回答what, where, why这3个问题:异常类型回答了“什么”被抛出,异常堆栈跟踪回答了“在哪“抛出,异常信息回答了“为什么“会抛出...

weixin_33923148的博客 333

CentOS 7环境下GLPI与OCS Inventory资产管理系统集成部署指南

本文详细介绍了在CentOS 7环境下,如何将GLPI与OCS Inventory两大开源工具进行集成部署,构建自动化资产管理系统。指南涵盖环境准备、核心服务安装、Web界面初始化、OCS插件配置及资产同步实战,帮助运维人员实现IT资产的自动发现、统一管理与可视化,大幅提升资产管理效率。

weixin_29274337的博客 326

【技术拆解】Illumina边合成边测序(SBS)核心流程全解析 | 从文库构建到数据分析

本文深入解析了Illumina边合成边测序(SBS)技术的完整流程。从DNA样本的文库构建(片段化、加接头、扩增),到Flowcell上的簇生成(桥式PCR),再到核心的边合成边测序(SBS)循环(荧光标记、可逆终止),最后简述了从原始数据到生物学洞见的数据分析步骤,为理解这一主流高通量测序技术提供了清晰的框架。

weixin_29201859的博客 535

小心异常(Exception)带来的风险(一)

  原文请看:http://www.javaworld.com/javaworld/jw-10-2003/jw-1003-generics.html  概要  Java提供了丰富的异常处理框架,但是尽管它很丰富和简单易用,却发现许多程序员很容易忽略它。这篇文章探究了抛掷、捕获和忽略普通异常的风险,并且提出在面对一个综合的大型软件项目时如何处理复杂异常的最佳方案。(2003年10月3日 By Pau

...... 1152

HLA分型

HLA分型 一、根据WES的tumor数据进行数据分型 选用hlahd 软件安装及使用 [root@18605fd8771e ~]# wget https://jaist.dl.sourceforge.net/project/bowtie-bio/bowtie2/2.4.1/bowtie2-2.4.1-linux-x86_64.zip [root@18605fd8771e ~]# unzip bowtie2-2.4.1-linux-x86_64.zip && mv bowtie2-2.4.1

qq_23435961的博客 2487

Java抓取异常后继续向上抛_Java异常被抛出或被捕获之后,代码是否继续执行的问题...

在写程序的时候,我们经常被教导,要对异常的信息进行处理,哪里该抛出异常。但是,更多的时候,我们只是模仿异常的抛出,却不知道为什么要这样抛异常(被catch了?被向上抛了?后面的代码是否执行了?)。接下来,我就简单的说一下异常抛出后的代码执行问题。此处不讨论自定义异常,因为自定义异常有自己的处理方式。一、结论:凡是有异常的地方,需要有处理异常的地方。(示例:Demo1, Demo2)只要异常被处理,...

weixin_39550486的博客 1414

第八届传智杯微信小程序开发挑战赛练习题库

本文是微信小程序开发练习题库,包含单选题、多选题和判断题三种题型。单选题主要考察小程序开发基础知识,如数组方法、组件使用、API调用等;多选题涵盖样式属性、页面跳转、数据处理等综合知识;判断题则测试开发者对小程序特性、生命周期、功能限制等概念的理解。题目内容涉及小程序开发的各个方面,包括组件使用、API调用、数据绑定、页面配置等核心知识点,适合开发者进行自我测试和知识巩固。

qq_73044452的博客 505

SPMI总线协议(一)

系统电源管理接口( System Power Management Interface简称SPMI)是一种双线串行接口,用于连接片上系统(SoC)处理器系统的集成电源控制器(PC)与一个或多个电源管理集成电路(PMIC)电压调节系统。SPMI 使系统能够使用单个 SPMI 总线动态调整 SoC 内部电压域的电源和衬底偏置电压。移动设备和其他便携式设计正日益采用系SPMI)协议,实现多主多从系统,根据实时系统需求监测和动态控制供电电压。设计人员可以在系统级实现更低的功率。

qflook的博客 880

异常的基本使用/对自定义异常进行捕获/栈解旋

2.1 try 试图执行 try{}中的内容 2.2 在可能出现异常的地方 抛出异常 throw 2.3 try下面 catch捕获异常 2.4 catch( 捕获类型 ) …代表 所有其他类型 2.5 如果不想处理异常,继续向上抛出 throw 2.6 如果没有任何处理异常的地方,那么成员调用terminate函数,中断程序 2.7 自定义异常类 ,可以抛出自定义的对象 ,捕获自定义的异常 3.1 从try开始 到 throw 抛出异常之前 所有栈上的对象 都会被释放 这个过程称为栈解旋 3.

Scarlett的博客 293

人工智能在文学领域的应用:创作无限可能的智能作家

人工智能在文学领域的应用:创作无限可能的智能作家 作者:禅与计算机程序设计艺术 1. 背景介绍 人工智能技术近年来飞速发展,在各个领域都有广泛应用。文学创作作为人类最高级的智力活动之一,也逐渐受到人工智能技术的影响和改变。随着自然语言处理、生成式模型等人工智能

AI天才研究院 1110

Java中的异常总结详解(异常类型、声明异常、抛出异常、捕获异常)

Java 异常解析前言 前言

YING—country的博客 3万+

从服务器到桌面超算:当3999美元的NVIDIA DGX Spark装上Ubuntu,普通开发者能玩出什么花?

DGX Spark的出现,标志着AI算力正在经历从"数据中心集中供给"到"个人桌面按需拥有"的范式转移。它让开发者可以在本地完成从数据预处理、模型微调到推理验证的全流程,只有在需要大规模训练时才调用云端资源。迭代速度:从按小时计费的云端调试,变成随时随地的本地实验数据主权:敏感信息永不离开本地成本可控:一次投入,长期使用,不受API调用次数限制AI算力民主化的时代,真的来了。你的下一台超级计算机,不必在云端。它就在你的桌面上,安静地等待着你的下一个创意。附录:实用资源。

QQ_778132974的博客 615

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java异常被抛出或被捕获之后,代码是否继续执行的问题 ...

在写程序的时候,我们经常被教导,要对异常的信息进行处理,哪里该抛出异常。但是,更多的时候,我们只是模仿异常的抛出,却不知道为什么要这样抛异常(被catch了?被向上抛了?后面的代码是否执行了?)。 接下来,我就简单的说一下异常抛出后的代码执行问题。此处不讨论自定义异常,因为自定义异常有自己的处理方式。 一、结论: 凡是有异常的地方,需要有处理异常的地方...

weixin_34392435的博客 5926

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java异常被抛出或被捕获之后,代码是否继续执行的问题

在写程序的时候,我们经常被教导,要对异常的信息进行处理,哪里该抛出异常。但是,更多的时候,我们只是模仿异常的抛出,却不知道为什么要这样抛异常(被catch了?被向上抛了?后面的代码是否执行了?)。 接下来,我就简单的说一下异常抛出后的代码执行问题。此处不讨论自定义异常,因为自定义异常有自己的处理方式。 一、结论: 凡是有异常的地方,需要有处理异常的地方。(示例:Demo1, Demo2) ...

Architect_优快云的博客 2717

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【C++】异常处理 ① ( 异常概念引入 | 抛出异常语法 | 捕获异常语法 | 异常捕获流程 | 异常处理代码示例 )

一、异常处理 1、异常概念引入 2、抛出异常语法 3、捕获异常语法 4、异常捕获流程 二、异常处理代码示例 1、错误代码示例 - 抛出异常 / 不捕获异常 2、正确代码示例 - 抛出异常 / 捕获异常 3、正确代码示例 - 抛出异常 / 捕获异常不处理继续抛出异常

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 5506

异常捕获抛出,循环中捕获抛出,程序和循环是否继续运行?

异常之后程序的运行情况,在循环中,不同的处理异常方式,程序是结束?继续?循环是继续?还是跳过?

hey_wei_ran的博客 2378

c#入门-抛出异常,捕获异常

一个程序可能因为各种各样的问题无法正常运行。重点是,我们要知道程序是因为什么问题而无法运行的。然后再根据问题来排除问题。一种常见的方式是给出一串错误码,然后开发人员查对照表。而在c#中,允许在程序内就解决问题。那么就不需要以字符串的形式给开发者看了。只需要直接使用类进行交互就行了。异常类继承自Exception类。如果不使用异常语法使用,那么他就是一个正常的类。可以new构造,可以赋值,可以取值。

zms9110750的博客 5153

java中异常抛出后代码还会继续执行吗

今天遇到一个问题,在下面的代码中,当抛出运行时异常后,后面的代码还会执行吗,是否需要在异常后面加上return语句呢? public void add(int index, E element){ if(size >= elements.length) { throw new RuntimeException("顺序表已满,无法添加"); //r...

聆听。。花开雨落的博客 3664

【Java】全面解析异常(异常的分类、处理、抛出和捕获等)

程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。”1.算术异常/byzero在JAVA中,我们都知道0不能作为除数,只能作为被除数,如果把0作为除数,编译器就会提示我们出先算术异常了。2.数组越界异常5数组越界,我们应该也不陌生,在使用数组时,如果超过了数组的大小,就会形成越界。程序就会发生异常,从而终止运行。3.空指针异常对于数组arr,让它赋值为null,我并没有让它指向任何对象,它就是一个空指针。对于空指针进行访问,编译器就会提示我们空指针异常。和。......

云泽野の编程日记 6239

AOP跨模块捕获异常遭CGLIB拦截而继续向上抛出异常

最近,在开发过程中,我遇到一个不易察觉的小bug。这个bug并没有直接给出报错信息,使得排查问题的根源变得困难。我希望通过分享这个经验,帮助大家避免重蹈覆辙,以免浪费不必要的时间和精力。为了避免类似的困境,我们应当时刻保持警惕,对开发过程中的每一个细节都进行严格的检查。同时,利用调试工具和日志输出等功能,可以帮助我们更快速地定位和解决问题。此外,定期进行代码审查和测试也是非常必要的,这有助于发现潜在的问题并及时解决。

船到桥头自然直 1645
上一篇: 为什么Java String.indexOf ()没有使用更加“高效”的字符串搜索算法
下一篇: printStackTrace()为什么是这个样子?
ProLayman
博客等级 码龄10年 105粉丝 192原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值