try-catch中的throw和throw ex的区别
一、简介
try-catch中的throw和throw ex是2种常见的用于抛出异常的方式,看似相似,但是它们的行为和影响有很大区别。
二、对比
- throw:直接抛出当前的异常对象。
- throw ex:重新抛出捕获到的异常对象。
三、分析
【throw】
最常用的抛出异常的行为。他会重新抛出当前捕获的异常对象,并保留原始异常信息,包括堆栈跟踪(Stack Trace),以为这你可以追溯到异常发生的最初始为止。
【throw ex】
只能捕获到异常对象,但会重置异常堆栈信息,导致丢失原始异常的初始位置,而不是保留原始异常堆栈信息,进而导致调试和追踪异常变得困难,所以不推荐使用。
四、推荐
可以用 throw new Exception() 通过对异常的重新包装,且保留原始异常点信息。 推荐使用。
五、扩展
5.1、多个try catch 嵌套,异常是如何捕获的?
【分析】:在一个函数中,当多个try-catch嵌套时,只会将最后一个异常抛出的位置记录到异常堆栈中。即ex3的位置,这叫层层上抛。
5.2、如果想全部捕获这种嵌套的异常,如何做?
【分析】:使用throw new Exception,每次捕获异常,便重新包装生成一个异常即可。