通过catch块直接处理父类和子类之间的异常有什么区别

时间:2016-03-14 12:11:29

标签: java exception-handling

我有以下Java代码

import org.testng.annotations.Test;

@Test
public void testException(){
    try{
        Assert.assertEquals(1,2);
    } catch(Exception e) {
      e.printStackTrace();
    }
}

运行测试时,断言失败,异常打印为标准输出,TestNG将测试结果显示为FAILED。

如果我使用

捕获相同的异常
catch(AssertionError e){
    e.printStackTrace();
}

异常打印为错误输出,TestNG将测试结果显示为PASSED。在这两种情况下都会处理异常,但这有什么区别?

2 个答案:

答案 0 :(得分:6)

AssertionError不是Exception的子类(它是Error的子类),所以第一个片段带有catch(Exception e)处理程序,没有抓住它。因此测试结果为FAILED。

第二个片段捕获了异常,因此就TestNG而言,testException()的测试中没有异常,结果已通过。

答案 1 :(得分:2)

因为AssertionErrorThrowableError的孩子,而不是来自Exception

java.lang.Object
   java.lang.Throwable
       java.lang.Error
           java.lang.AssertionError

所以这一行:

catch(Exception e){

在出错的情况下不会抓住它。你能做的是:

catch(Error e){

catch(Throwable t){

但你必须小心explained here