2015-04-16 52 views
16

代码: -在java异常的catch块中会发生断言错误吗?

try { 
    Assert.assertEquals("1", "2"); 
} catch (Exception e) { 
    System.out.println("I am in error block"); 
} 

如果断言语句失败,我想捕获错误catch块。我正在尝试使用上面的代码,但没有发生。

在Java异常的catch块中会检测到断言错误吗?

+2

反正你为什么要这么做?这看起来像是严重滥用'Assert'这是为了单元测试 – Dragondraikk

回答

27

你几乎回答了你自己的问题。您的catch块不会捕获Assert如果失败将抛出的AssertionError,因为它是Error(或更具体地说,它延伸至java.lang.Error)。 See the docs欲了解更多信息。你的catch块只捕获Throwable对象扩展java.lang.Exception

如果你真的想抓住它 - 你需要使用

catch (AssertionError e) { 
... 

然而,为othersmentioned,这是一个非常不寻常的道路要使用断言 - 他们通常应该通过,如果失败了,你想要继续执行程序是非常不寻常的。这就是为什么失败抛出Error而不是Exception。您可以在this question中阅读关于(不)捕获Error的更多信息。

你确定你不只是想测试 - if (variableName == "1")

NB如果您正在测试单元测试帮助程序代码,就像匹配程序一样,那么赶上AssertionError可能是有意义的。

+0

当你想知道单元测试助手类是否正确地做了某事(通过单元测试;-)),人们希望能够捕捉到这样一个AssertionError。这将是一个有效的情况来抓住它,不是吗? – gkephorus

+0

@ gphphorus是的,我想它可能是。随意编辑为“N.B.”。如果你喜欢,我会批准它:) –

+0

@JRichardSnape - 我想比较两个只有字符串变量的java对象(从json对象获得)与getter&setters POJO。我只想比较一些(不是全部)变量来确定匹配。对于其中一个变量,只能比较部分值。将所有断言放入try catch(AssertionError)块是否是一个好主意?这样,我可以在catch部分返回false来指示哪个字段不匹配,并带有一个有用的错误消息字符串。这样,我就不用再写几个字了。听起来没问题? – testerjoe2

2

嗯,我相信你正在使用JUnit编写你的测试。在这种情况下,你不应该赶上你的Assert.assertEquals(),因为他们应该通过正常的测试执行。如果它抛出任何异常,这意味着你的代码没有按照应有的执行。

+0

是的,我的断言代码抛出一个异常。但我想通过Exception类捕获所有错误,如断言或任何其他错误。我该怎么做 ? – karan

+2

你不能。 'AssertionError'继承自'Error',这意味着'try ... catch'将无法处理它们。请参阅https://docs.oracle.com/javase/7/docs/api/java/lang/AssertionError.html。如果你无论如何需要抓住它们,请参阅SpaceCowboy的答案。 – Aakash

2

如果你想赶上那样的错误,你需要像下面这样:

if (num == 1 || num == 2) { 
    throw new Exception(); 
} 

你可以创建自己的异常类,并通过你想要的消息中。