try catch 嵌套

article/2025/10/16 10:55:26

实践测试

在单元测试中写入以下方法:
testMain()主方法,
out()里面嵌套了两层try catch
异常代码写在内层try中

示例一:

    @Testpublic void testMain(){out();log.info("后续处理业务");}public void out(){//外层trytry {System.out.println("外层输出");//内层trytry {int i = 2/0; //异常代码}catch (Exception e){log.error("内层异常",e);}}catch (Exception e){log.error("外层异常",e);}}

日志信息:
在这里插入图片描述

外层输出
20:38:27.172 [main] ERROR com.eshore.paas.ops.serv.secondalert.secondAlertTest - 内层异常
java.lang.ArithmeticException: / by zeroat com.eshore.paas.ops.serv.secondalert.secondAlertTest.out(secondAlertTest.java:52)at com.eshore.paas.ops.serv.secondalert.secondAlertTest.testMain(secondAlertTest.java:42)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
20:38:27.179 [main] INFO com.eshore.paas.ops.serv.secondalert.secondAlertTest - 后续处理业务

可以看到,内层try中的异常由内层catch处理了,外层catch并未处理,主方法后续业务逻辑并未受到影响,可正常执行.

示例二:

内层try catch中添加throw new RuntimeException("内层抛出异常",e)将异常抛出

    @Testpublic void testMain(){out();log.info("后续处理业务");}public void out(){//外层trytry {System.out.println("外层输出");//内层trytry {int i = 2/0;}catch (Exception e){log.error("内层异常",e);//向外抛出异常throw new RuntimeException("抛出异常",e);}}catch (Exception e){log.error("外层异常",e);}}

日志信息:
在这里插入图片描述

外层输出
20:47:15.890 [main] ERROR com.eshore.paas.ops.serv.secondalert.secondAlertTest - 内层异常
java.lang.ArithmeticException: / by zeroat com.eshore.paas.ops.serv.secondalert.secondAlertTest.out(secondAlertTest.java:52)at com.eshore.paas.ops.serv.secondalert.secondAlertTest.testMain(secondAlertTest.java:42)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
20:47:15.894 [main] ERROR com.eshore.paas.ops.serv.secondalert.secondAlertTest - 外层异常
java.lang.RuntimeException: 内层抛出异常at com.eshore.paas.ops.serv.secondalert.secondAlertTest.out(secondAlertTest.java:55)at com.eshore.paas.ops.serv.secondalert.secondAlertTest.testMain(secondAlertTest.java:42)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)at org.junit.runners.ParentRunner.run(ParentRunner.java:363)at org.junit.runner.JUnitCore.run(JUnitCore.java:137)at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:69)at com.intellij.rt.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:33)at com.intellij.rt.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:221)at com.intellij.rt.junit.JUnitStarter.main(JUnitStarter.java:54)
Caused by: java.lang.ArithmeticException: / by zeroat com.eshore.paas.ops.serv.secondalert.secondAlertTest.out(secondAlertTest.java:52)... 23 common frames omitted
20:47:15.894 [main] INFO com.eshore.paas.ops.serv.secondalert.secondAlertTest - 后续处理业务

内层try catch向外抛出异常以后,外层try catch捕获了异常,并打印日志。主方法中后续处理业务逻辑正常执行。

示例三:

在外层try catch中再次将异常抛出throw new RuntimeException("外层抛出异常",e);

    @Testpublic void testMain(){out();log.info("后续处理业务");}public void out(){//外层trytry {System.out.println("外层输出");//内层trytry {int i = 2/0;}catch (Exception e){log.error("内层异常",e);throw new RuntimeException("内层抛出异常",e);}}catch (Exception e){log.error("外层异常",e);//向外抛出异常throw new RuntimeException("外层抛出异常",e);}}

日志信息:
在这里插入图片描述

可以看到,程序运行错误。
因为out()方法外层try catch抛出异常以后,主方法并未进行处理导致的

改进:
在主方法中,对out()添加一层try catch进行异常处理:

    @Testpublic void testMain(){//添加异常处理try {out();}catch (Exception e){log.info("处理out()方法异常",e);}log.info("后续处理业务");}public void out(){//外层trytry {System.out.println("外层输出");//内层trytry {int i = 2/0;}catch (Exception e){log.error("内层异常",e);throw new RuntimeException("内层抛出异常",e);}}catch (Exception e){log.error("外层异常",e);throw new RuntimeException("外层抛出异常",e);}}

此时可以看到主方法处理异常以后,可以正常向下执行.
在这里插入图片描述

示例四

如果out()方法中的异常代码不在try 代码块中,且主方法也没有对out()方法进行异常捕获处理会怎样?
代码:

    @Testpublic void testMain(){out();log.info("后续处理业务");}public void out(){//添加异常代码,不在try 代码块中int j = 3/0;//外层trytry {System.out.println("外层输出");//内层trytry {int i = 2/0;}catch (Exception e){log.error("内层异常",e);throw new RuntimeException("内层抛出异常",e);}}catch (Exception e){log.error("外层异常",e);throw new RuntimeException("外层抛出异常",e);}}

日志:
在这里插入图片描述
程序直接报错

那么该如何处理?
在out()的上层方法即主方法中,对out()进行异常处理

    @Testpublic void testMain(){//对out()进行异常处理try {out();}catch (Exception e){log.info("处理out()方法异常",e);}log.info("后续处理业务");}public void out(){int j = 3/0;//外层trytry {System.out.println("外层输出");//内层trytry {int i = 2/0;}catch (Exception e){log.error("内层异常",e);throw new RuntimeException("内层抛出异常",e);}}catch (Exception e){log.error("外层异常",e);throw new RuntimeException("外层抛出异常",e);}}

日志信息:
在这里插入图片描述
可以看出程序正常执行.

结论:
下层方法中的异常代码没有在try 代码块中,只需在上层方法中进行异常处理即可


http://chatgpt.dhexx.cn/article/e0EnXX2t.shtml

相关文章

try和catch的用法

try 和 catch 是用于处理异常的语句,它们构成了一种异常处理机制。在一个 try 语句中,程序执行一段代码,如果发生了异常,则会被捕获,并转到相应的 catch 语句中进行处理。 例如,在下面的代码中&#xff0c…

try-catch的使用以及细节

文章目录 try-catch的使用以及细节1. 基本语法2. 注意细节快捷键 try-catch的使用以及细节 🎈 Java中提供 try 和catch块来处理异常。try块用于包含可能出错的代码。catch块用于处理try块中发生的异常。可以根据需要在程序中有多个try…catch块。 1. 基本语法 try{…

【小波变换】wavedecn方法

wavedecn wavedecn(data, wavelet, modesymmetric, levelNone, axesNone)Multilevel nD Discrete Wavelet Transform.Parameters----------data : ndarraynD input data# 可通过设置axes参数,来确定小波变化的维度axes : sequence of ints, optionalAxes over which…

Wave Engine 3.1 Released

Wave Engine最近发布了3.1版。 Wave Engine是一款完全免费的3D游戏引擎,能够针对大多数平台和XR设备。该版本带来了对.NET 5和C#9的支持以及图形上的改进。 我们很高兴地宣布,与Microsoft合作,我们刚刚发布了WaveEngine 3.1&…

小波变换——提取图像(低频/宏观)到(高频/微观)信息

对我来说,小波分解属于研究大结构框架中图像预处理最基础的地方,由于创新性不足,一年多前尝试过以后就被搁置;现已研究出较新的多尺度/多分辨率特征提取算法,故将小波变换留个纪念。 import cv2 import numpy as np i…

Waves插件

Waves插件 下载安装包查看是否存在之前版本的waves 用控制面板或者其他软件 卸载 去控制面板中,正常缷掉WAVES 9安装目录,把残留的WAVES文件夹干掉!清理注册表内的内容: 32bit : HKEY_LOCAL_MACHINE\Software\Waves 64bit : HKE…

小波变换(Wavelet Transform)

最近在学习数据挖掘的数据预处理一章中碰到了小波变换,之前并没有学习过有关信号处理的东西,所以参考网上的资料,对其做一个简单的了解,后面如果用得到,再做深入的学习。 本人是相关方面的小白,如有搬运理解…

基于小波变换实现图像增强

1,基于小波变换的图像低通滤波 %小波变换进行滤波变换 clc,clear,close all; Image rgb2gray(imread(baboon.jpg)); nIg imnoise(Image,gaussian); [C,S] wavedec2(nIg,3,db4);%采用db4小波对噪声图像进行3级分解 len length(C); C1 C;C2 C;C3 C; C1(S(1,1)…

waves服务器系统包,Waves Complete 12

Waves Complete 12是一款功能十分强大好用的音频制作类软件哦,且软件中还有着丰富的插件可供用户们选择和使用哦。且全套的音频效果器,也能够满足用户后期混音的需求哦~ Waves Complete 12介绍: 1、调整插件的界面显示比例 5种大小可调&#…

ES8311 低功耗单声道音频编解码器(中文)

版本11.0 低功耗单声道音频编解码器 特征 系统 • 高性能、低功耗多位音频ADC和DAC • I2S/PCM 主串行或从串行数据端口 • 256/384Fs, USB 12/24 MHz 和其他非标准音频系统时钟 • I2C 接口 ADC • 24 位、8 至 96 kHz 采样频率 • 100 dB 信噪比,-93 dB THDN…

小波变换对图像的分解与重构(含matlab代码)

01 小波变换原理 所谓的小波的小是针对傅里叶波而言,傅里叶波指的是在时域空间无穷震荡的正弦(或余弦波)。 相对而言,小波指的是一种能量在时域非常集中的波,它的能量有限,都集中在某一点附近&#xff0…

多尺度二维离散小波分解wavedec2

对X进行N尺度小波分解 [C,S]wavedec2(X,N,wname); clc,clear all,close all; load woman; [c,s]wavedec2(X,2,db1);%进行2尺度二维离散小波分解。分解小波函数-db1 [cH1,cV1,cD1]detcoef2(all,c,s,1);%尺度1的所有方向的高频系数 [cH2,cV2,cD2]detcoef2(all,c,s,2);%尺度2的所有…

图像处理-小波变换

小波指的是一种能量在时域非常集中的波,它的能量有限,都集中在某一点附近,而且积分的值为零,这说明它与傅里叶波一样是正交波。 图像的傅里叶变换是将图像信号分解为各种不同频率的正弦波。同样,小波变换是将图像信号分…

【Matlab代码】图像的小波分解和重构实现

一、原理 MATLAB中实现图像分解和重构的命令主要有dwt2(idwt2)和 wavedec2( waverec2)。其中,进行一层小波分解的命令为dwt2,对应的小波重构命令为idwt2;进行多层分解的命令为wavedec2,对应的重构命令为 wavered2。 1.1 一层小波…

matlab Wavedec.函数

Wavedec函数 最具挑战性的挑战莫过于提升自我。——迈克尔F斯特利 Wavedec函数 [函数功能] 多尺度一维小波分级。 [语法格式] ○1[C,L] Wavedec (X,N,wname) ○2[C,L] Wavedec (X,N,Lo_D,Hi_D) [使用说明] Wavedec使用给定的小波wna…

二维小波变换——wrcoef2、upcoef2、detcoef2、appcoef2(转)

二维离散小波变换的函数同样可分为3大功能: (1)分解与重构/恢复信号: 1级分解与重构原始信号函数为:dwt2 与 idwt2 多级(包括1级)分解与重构原始信号函数为:wavedec2 与 waverec2 (2&#xff09…

[c0,s0] = wavedec2(M1, N, wtype);

采用小波分解行 clear ; X1 imread(20170901204704.jpg); imshow(X1); figure; M1 double(X1) / 256; imshow(M1); N 4; wtype sym4; [c0,s0] wavedec2(M1, N, wtype); M1导入后为809*803*3,numel(M1) 1948881; 而length(c0) 2011320; 两者并非是按照小…

wav2vec--

Wav2vec: Unsupervised Pre-training for Speech Recognition 该模型非完整的ASR,而是一个将wav通过标记的、未标记的数据,通过无监督的方式进行训练,得到可以送入ASR中的向量;以提升ASR的准确率; Wav2vec首先训练一个…

二维小波变换——wrcoef2、upcoef2、detcoef2、appcoef2

文章目录 1.wrcoef22.upcoef23.detcoef24.appcoef2 1.wrcoef2 功能:从二维小波系数重构单分支 用法: X wrcoef2(‘type’,C,S,wname,N) 根据小波分解结构[C,S],计算N级重构系数矩阵。wname是包含小波名称的字符向量或字符串标量…

MATLAB 之 wavedec2函数详解

wavedec2函数: 1.功能:实现图像(即二维信号)的多层分解,多层,即多尺度. 2.格式:[c,s]wavedec2(X,N,wname) [c,s]wavedec2(X,N,Lo_D,Hi_D)(我不讨论它) 3.参数说明:对图像X用wname小波基函数实现N层分解, 这里的小波基函数应该根据实际情况选择,具体选择办法可以搜之…