try catch 嵌套

这篇具有很好参考价值的文章主要介绍了try catch 嵌套。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实践测试

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

示例一:

    @Test
    public void testMain(){
        out();
        log.info("后续处理业务");
    }

    public void out(){
        //外层try
        try {
            System.out.println("外层输出");
            //内层try
            try {
                int i = 2/0; //异常代码
            }catch (Exception e){
                log.error("内层异常",e);
            }

        }catch (Exception e){
            log.error("外层异常",e);
        }
    }

日志信息:
try catch 嵌套

外层输出
20:38:27.172 [main] ERROR com.eshore.paas.ops.serv.secondalert.secondAlertTest - 内层异常
java.lang.ArithmeticException: / by zero
	at 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)将异常抛出

    @Test
    public void testMain(){
        out();
        log.info("后续处理业务");
    }

    public void out(){
        //外层try
        try {
            System.out.println("外层输出");
            //内层try
            try {
                int i = 2/0;
            }catch (Exception e){
                log.error("内层异常",e);
                //向外抛出异常
                throw new RuntimeException("抛出异常",e);
            }

        }catch (Exception e){
            log.error("外层异常",e);
        }
    }

日志信息:
try catch 嵌套

外层输出
20:47:15.890 [main] ERROR com.eshore.paas.ops.serv.secondalert.secondAlertTest - 内层异常
java.lang.ArithmeticException: / by zero
	at 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 zero
	at 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);

    @Test
    public void testMain(){
        out();
        log.info("后续处理业务");
    }

    public void out(){
        //外层try
        try {
            System.out.println("外层输出");
            //内层try
            try {
                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 catch 嵌套

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

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

    @Test
    public void testMain(){
    //添加异常处理
        try {
            out();
        }catch (Exception e){
            log.info("处理out()方法异常",e);
        }

        log.info("后续处理业务");
    }

    public void out(){
        //外层try
        try {
            System.out.println("外层输出");
            //内层try
            try {
                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 catch 嵌套

示例四

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

    @Test
    public void testMain(){
        out();
        log.info("后续处理业务");
    }

    public void out(){
        //添加异常代码,不在try 代码块中
        int j = 3/0;

        //外层try
        try {
            System.out.println("外层输出");
            //内层try
            try {
                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 catch 嵌套
程序直接报错

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

    @Test
    public void testMain(){
    //对out()进行异常处理
        try {
            out();
        }catch (Exception e){
            log.info("处理out()方法异常",e);
        }

        log.info("后续处理业务");
    }

    public void out(){
        int j = 3/0;

        //外层try
        try {
            System.out.println("外层输出");
            //内层try
            try {
                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 catch 嵌套
可以看出程序正常执行.

结论:
下层方法中的异常代码没有在try 代码块中,只需在上层方法中进行异常处理即可文章来源地址https://www.toymoban.com/news/detail-456624.html

到了这里,关于try catch 嵌套的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C# try catch 使用

    try catch使用场景: 1. 一般在线程,委托中使用, 在线程与委托中使用是因为,如果线程和委托中出现异常在程序外部是捕获不到的,需要在内部做单独处理。 2. 程序的外层使用,比如程序的入口处加一个全局异常捕获,这样整个程序发生的异常都可以捕获到。 3. 在事件或

    2024年02月09日
    浏览(43)
  • try catch执行过程分析

    本篇文章带大家聊聊try catch的执行过程,有时候在开发的过程中,try代码里如果出现异常,catch后的步骤还会继续执行吗?以及finally的使用。 下面来分析一下几种使用场景: 场景一: try代码块中出现异常后,系统会继续执行catch代码块的程序。catch代码块外的代码也会继续被

    2024年02月15日
    浏览(41)
  • Java try catch语句详解

    在实际应用中,对于错误的处理是极其重要的,任何程序都很难做到百分百完美,程序中可能存在大量未知问题,所以程序开发时一定要对各种问题进行相应的处理,而 Java 提供的异常处理机制可以帮用户更好地解决这方面的问题。 Java 的异常处理机制可以让程序具有极好的

    2024年02月08日
    浏览(40)
  • 记录--try...catch知识补全

    说到 try...catch 都觉得非常熟悉了,不就是用来捕捉代码块中的错误嘛,平时也用得比较多的。然而因为了解不够多,我的面试却栽在了一个简单的知识点上: try...catch 只能捕捉到同步执行代码块中的错误 。 题目是:以下代码有错吗?如果有错,应该如何改正? 反正就是不

    2024年02月04日
    浏览(45)
  • 深入理解try...catch(字节码层面)

    我们工作中常用try...catch来解决程序中出现的异常情况,但是你真的了解它的实现原理吗?今天我就带着大家从字节码层面理解try...catch 我们首先需要准备好异常类和对应的测试类方便我们观察。 异常类: 测试类: 在idea中编译后,使用jclasslib插件即可查看对应的字节码,字

    2024年02月02日
    浏览(37)
  • C#中try-catch语句

            在C#中,try-catch语句是一种异常处理机制,用于捕捉代码中发生的异常并作出相应的处理,防止程序因异常而崩溃。 try块中包含可能会出现异常的语句或代码块。当try块中的语句或代码块执行过程中发生异常时,程序会立即跳转到catch块,并执行catch块中的语句。

    2024年02月14日
    浏览(42)
  • try-catch以及使用技巧

    try-catch 是 JavaScript 处理错误的一种重要机制。try 块用来包含可能会出错的代码,catch 块用来处理 try 块中的错误。使用 try-catch 的主要目的是在代码出错时不会导致整个程序崩溃,可以让错误被妥善处理。 如果你想捕获代码中所有可能的异常,可以使用一个不带参数的 catch 代码

    2024年02月22日
    浏览(45)
  • 如何优雅的写个try catch的方式!

    丑陋的 try catch 代码块 优雅的 Controller 上面的示例,还只是在 Controller 层,如果是在 Service 层,可能会有更多的 try catch 代码块。这将会严重影响代码的可读性、“美观性”。 所以如果是我的话,我肯定偏向于第二种,我可以把更多的精力放在业务代码的开发,同时代码也会

    2024年02月01日
    浏览(40)
  • 不要在代码中随便使用try...catch了

    前言  📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步!  🍅  个人主页: 南木元元 目录 背景 js中的try...catch try...catch运行机制 js的事件循环机制 try...catch无法捕获异步错误的原因 解决方法 结语 之前面某物的时候,遇到了一个有关try...catch的问

    2024年03月14日
    浏览(66)
  • kotlin协程异常处理之-try catch

    kotlin协程小记 协程的async使用 kotlin协程异常处理之-try catch kotlin协程异常处理之-CoroutineExceptionHandler try catch是否一定有效呢?未必,来看一下: withContext是一个挂起函数,它会暂停当前协程的执行,等待传递进来的协程上下文切换后继续执行。当在withContext内部发生异常时,

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包