java try catch嵌套_try catch里面try catch嵌套

try catch里能否内嵌try catch?答案是肯定的。但是等内层try catch出异常之后是个什么执行顺序呢?看下面代码

48304ba5e6f9fe08f3fa1abda7d326ab.png

static void Main(string[] args)

{

try

{

Console.WriteLine("----------------------外层try------------------------------");

errorMethod();

}

catch (Exception ex)

{

Console.WriteLine("----------------------外层catch" + ex.Message + "------------------------------");

}

finally {

Console.WriteLine("----------------------外层finally------------------------------");

}

Console.ReadKey();

}

private static void errorMethod()

{

try

{

Console.WriteLine("----------------------内层try------------------------------");

int i = 0;

int a = 100/i;

}

catch (Exception ex)

{

Console.WriteLine("----------------------内层catch" + ex.Message + "------------------------------");

}

finally {

Console.WriteLine("----------------------内层finally------------------------------");

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

44814b0354fbc7386a3d244bb3c9ccfb.png

内层catch处理了异常,所以没有执行外层catch。

咱们把内层的catch注释掉  再试下

48304ba5e6f9fe08f3fa1abda7d326ab.png

static void Main(string[] args)

{

try

{

Console.WriteLine("----------------------外层try------------------------------");

errorMethod();

}

catch (Exception ex)

{

Console.WriteLine("----------------------外层catch" + ex.Message + "------------------------------");

}

finally {

Console.WriteLine("----------------------外层finally------------------------------");

}

Console.ReadKey();

}

private static void errorMethod()

{

try

{

Console.WriteLine("----------------------内层try------------------------------");

int i = 0;

int a = 100/i;

}

//catch (Exception ex)

//{

// Console.WriteLine("----------------------内层catch" + ex.Message + "------------------------------");

//}

finally {

Console.WriteLine("----------------------内层finally------------------------------");

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

9c598209926612393fc18d362753184d.png

很明显,外层catch捕获了异常。

总结:try catch嵌套,内层不能捕获时,会考虑外层内否捕获,内层能捕获,则外层catch不执行。

48304ba5e6f9fe08f3fa1abda7d326ab.png

try

{

//A

try

{

//B

}

catch

{

//C

}

finally

{

//D

}

//E

}

catch

{

//F

}

finally

{

//G

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

上面的代码 执行顺序

抛出异常在:内层A,E处由外层catch块捕获,并执行外层finally

抛出异常在:内层B处,且有一合适内层catch捕获,执行内层finally,后执行E处

抛出异常在:内层B处,但内层catch块没有合适处理程序,执行内层finally,搜索外层catch,找合适的,执行外层finally,此时不会执行E

抛出异常在:内层C处,退出内层catch块,执行内层finally,搜索外层catch,找到合适,执行外层finally

抛出异常在:内层D处,退出内层finally块,搜索外层catch,找到合适,执行外层finally

A抛异常 A=》F=》G

B抛异常 C能捕获 B=》C=》D=》E=》F=》G (若C处无法捕获B=》F=》G)

C抛异常 C=》F=》G

D抛异常 D=》F=》G

E抛异常 A=》F=》G 同A

另外 try{}catch{} 中未做捕获类型限定,可捕获所以异常。如 try{}catch(IOException ex){} 则catch只能捕获I/O操作引发的异常。

(文章摘自--http://www.cnblogs.com/zhangchengye/p/5674240.html)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,可以使用try-catch语句来处理异常。try块中包含可能会引发异常的代码,而catch块用于捕获并处理这些异常。嵌套try-catch语句可以用于处理多个层次的异常情况。 在引用\[1\]中的示例中,有一个嵌套try-catch结构。外层try块用于捕获外层的异常,而内层try块用于捕获内层的异常。如果内层的异常被捕获,可以在catch块中进行相应的处理。在这个示例中,内层的异常被捕获后,使用log.error()方法记录异常信息。 在引用\[2\]中的示例中,内层的catch块添加了throw new RuntimeException()语句,将异常抛出。这样做可以将异常传递给调用者,以便在更高层次的代码中处理异常。 总之,try-catch嵌套可以用于处理多个层次的异常情况,使程序能够正常运行并提供异常信息。 #### 引用[.reference_title] - *1* *2* [try catch 嵌套](https://blog.csdn.net/qq_44209563/article/details/123695520)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [try catch里面try catch嵌套](https://blog.csdn.net/wangdd_199326/article/details/80363114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值